提取每个单词的第一个字母,但保留特定的标点符号

Extract first letter in each word but keeping specific punctuation

我有一个包含几百万长的人名的向量,我想删除所有字符,但每个单词的第一个字母(即首字母)和一些字符,如“;”和 '-'。该向量在名称格式上有很大差异,小样本如下所示:

text <- c("Alwyn Howard Gentry", "a. h. gentry", "A H GENTRY", "A. H. G.", 
          "Carl von Martius", "Leitão Filho, H. F. ; Shepherd, G. J.",
          "Dárdano de Andrade - Lima")

我使用了下面的解决方案,它给出了所需的输出,但是太耗时了:

unlist(lapply(strsplit(text, " ", fixed = TRUE),
                                   function(x) paste0(substr(x, 1, 1), collapse="")))

"AHG"      "ahg"      "AHG"      "AHG"      "CvM"      "LFHF;SGJ" "DdA-L"

所以我尝试根据正则表达式和 gsub 改编我找到的 的答案。我设法同时获得了首字母但不是首字母和字符:

gsub('\b(\pL)|.', '\1', text, perl = TRUE)

"AHG"     "ahg"     "AHG"     "AHG"     "CvM"     "LFHFSGJ" "DdAL"

我真的是正则表达式的新手。我试着改编 '\b(\pL)|'。部分代码将字符包含在模式中,但我尝试了几个小时后放弃了。

关于我应该使用哪个正则表达式来使用 gsub() 获得与我使用 strsplit() 和 sapply() 获得的相同结果的任何想法?

非常感谢!

您可以使用

text <- c("Alwyn Howard Gentry", "a. h. gentry", "A H GENTRY", "A. H. G.", "Carl von Martius", "Leitão Filho, H. F. ; Shepherd, G. J.", "Dárdano de Andrade - Lima")
gsub("(*UCP)(\b\p{L}|[;-])(*SKIP)(*F)|.", "", text, perl=TRUE)
## Or, alternatively,
gsub("(*UCP)[^;-](?<!\b\p{L})", "", text, perl=TRUE)

参见R demo and a regex demo #1/regex demo #2

详情:

  • (*UCP) - 使 \b 识别 Unicode
  • 的 PCRE 动词
  • (\b\p{L}|[;-])(*SKIP)(*F) - 单词开头的任何 Unicode 字母或 ;-,然后跳过匹配,并从中搜索下一个匹配发生故障的位置
  • | - 或
  • . - 除换行符以外的任何字符
  • [^;-](?<!\b\p{L}) - 除了 ;- 之外的任何字符,它们不是以字符串开头或非单词字符开头的任何 Unicode 字母。