提取R中每个单词的第一个字母

时间:2018-08-31 17:11:47

标签: r regex

我有一个带一些分类变量的data.frame。假设sentences是这些变量之一:

sentences <- c("Direito à participação e ao controle social",
               "Direito a ser ouvido pelo governo e representantes", 
               "Direito aos serviços públicos",
               "Direito de acesso à informação")

对于每个值,我只想提取每个单词的第一个字母,而忽略该单词是否具有4个或更少的字母(e,de,à,a,aos,ser,pelo),我的目标是创建首字母缩写词变量。我希望得到以下结果:

[1] "DPCS", "DOGR", "DSP", "DAI

我尝试使用stringr和建立为here的正则表达式模式创建模式子集:

library(stringr)
pattern <- "^(\b[A-Z]\w*\s*)+$"
str_subset(str_to_upper(sentences), pattern)

但是创建pattern对象时出现错误:

Error: '\w'  is an escape sequence not recognized in the string beginning with ""^(\b[A-Z]\w"

我在做什么错了?

在此先感谢您的帮助。

2 个答案:

答案 0 :(得分:7)

您可以使用gsub删除所有不需要的字符,并保留所需的字符。从预期的输出来看,您似乎仍在使用3个字符长的单词中的字符:

 gsub('\\b(\\pL)\\pL{2,}|.','\\U\\1',sentences,perl = TRUE)
[1] "DPCS"   "DSOPGR" "DASP"   "DAI"  

但是,如果我们要忽略您指示的单词,那就是:

gsub('\\b(\\pL)\\pL{4,}|.','\\U\\1',sentences,perl = TRUE)
[1] "DPCS" "DOGR" "DSP"  "DAI"  

答案 1 :(得分:1)

您可以使用以下模式:(?<=^| )\S(?=\pL{4,})

我在后面使用了积极的眼神,以确保匹配项前面有空格或行首。然后,我匹配一个字符,前提是它后面跟着4个或更多字母,因此为正向。

我建议您不要在非英语语言中使用\w,因为它不会与任何带有重音符号的字符匹配。相反,\pL匹配来自任何语言的任何字母。

一旦您有匹配项,就可以将它们连接起来以创建您的字符串(dpc,dogr等...)

Here's a demo