我有一个包含数百万长人名的向量,我想删除所有字符,但每个单词的第一个字母(即首字母缩写(和一些字符,如";"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字母