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



我有一个包含数百万长人名的向量,我想删除所有字符,但每个单词的第一个字母(即首字母缩写(和一些字符,如";"one_answers"-"。矢量在名称格式上有很大的变化,一个小样本看起来像这样:

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"

因此,我试图根据regexp和gsub调整我在这里找到的答案。我设法得到了首字母,但没有同时得到首字母和字符:

gsub('\b(\pL)|.', '\1', text, perl = TRUE)
"AHG"     "ahg"     "AHG"     "AHG"     "CvM"     "LFHFSGJ" "DdAL"

我真的是regexp的新手。我试着改编"\b(\pL(|"部分代码将字符包括在模式中,但我在尝试了几个小时后放弃了。

关于我应该使用哪一个正则表达式来获得与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演示和regex演示#1/regex演示#2。

详细信息

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

相关内容

  • 没有找到相关文章

最新更新