提取每个单词的第一个字母,但保留特定的标点符号
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 字母。
我有一个包含几百万长的人名的向量,我想删除所有字符,但每个单词的第一个字母(即首字母)和一些字符,如“;”和 '-'。该向量在名称格式上有很大差异,小样本如下所示:
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 字母。