删除r中的部分字符串

时间:2018-01-09 20:35:44

标签: r regex text-mining

我正在尝试在字符串末尾提取 ES

> data <- c("phrases", "phases", "princesses","class","pass")
> data1 <- gsub("(\\w+)(s)+?es\\b", "\\1\\2", data, perl=TRUE)
> gsub("(\\w+)s\\b", "\\1", data1, perl=TRUE)
[1] "phra"    "pha"     "princes" "clas"    "pas" 

我得到了这个结果

 [1] "phra"    "pha"     "princes" "clas"    "pas" 

但实际上我需要获得的是:

[1] "phras"    "phas"     "princess" "clas"    "pas" 

2 个答案:

答案 0 :(得分:2)

如果可以保证每个单词后跟一个标点符号或位于字符串的末尾,则可以使用单词边界(\\b):

data <- c("phrases, phases, princesses, bases")

gsub('es\\b', '', data)
# [1] "phras, phas, princess, bas"

使用您的方法,只需用一组括号将所有内容包装到第二个+

gsub("(\\w+s+)es\\b", "\\1", data)
# [1] "phras, phas, princess, bas"

由于您尝试匹配尽可能多的连续+,因此也无需?s一起使用。

修改

OP改变了数据和所需的输出。以下是一个简单的解决方案,可以删除每个字符串末尾的ess

data <- c("phrases", "phases", "princesses","class","pass")

gsub('(es|s)\\b', '', data)
# [1] "phras"    "phas"     "princess" "clas"     "pas" 

答案 1 :(得分:0)

也许你正在寻找一个lookbehind断言(这是一个0长度匹配)

"(?<=s)es\\b"

或因为lookbehind不能使用可变长度的perl \K构造来保持\K

之外的匹配
"\\ws\\Kes\\b"