我正在尝试在字符串末尾提取 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"
答案 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改变了数据和所需的输出。以下是一个简单的解决方案,可以删除每个字符串末尾的es
或s
:
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"