给出此向量:
ba <- c('baa','aba','abba','abbba','aaba','aabba')'
我想将每个单词的最后a
更改为i
,除了baa
和aba
。
我写了下一行...
gsub('(?<=a[ab]b{1,2})a','i',ba,perl=T)
但被告知:[PCRE模式编译错误'在')a'处的后向断言'不是固定长度'。
我环顾四周,显然R / Perl只能向前看可变宽度,而不能向后看。任何解决此问题的方法?谢谢!
您可以改用后向替代\K
。此转义序列会重置报告的匹配项的起点,并且不再包含任何以前使用的字符。
已引用-rexegg
\ K和后向标记之间的主要区别在于,在PCRE中,后向标记不允许您使用量词:查找的长度必须固定。另一方面,\ K可以放在模式中的任何位置,因此您可以随意在\ K之前放置任何喜欢的量词。
在上下文中使用:
sub('a[ab]b{1,2}\\Ka', 'i', ba, perl=T)
# [1] "baa" "aba" "abbi" "abbbi" "aabi" "aabbi"
避免环顾四周:
sub('(a[ab]b{1,2})a', '\\1i', ba)
# [1] "baa" "aba" "abbi" "abbbi" "aabi" "aabbi"
另一种解决方法仅针对当前情况,当使用的唯一量词是limiting quantifier时,可能正在使用stringr::str_replace_all
/ stringr::str_replace
:
> library(stringr)
> str_replace_all(ba, '(?<=a[ab]b{1,2})a', 'i')
[1] "baa" "aba" "abbi" "abbbi" "aabi" "aabbi"
之所以起作用,是因为stringr
正则表达式函数基于ICU regex,并具有constrained-width后向特征:
不能使用无限制模式匹配的字符串的长度(没有
*
或+
运算符。]
因此,您实际上无法在ICU后视中使用任何类型的模式,但很高兴知道,当您需要在已知距离范围内获取重叠文本时,可以在其中至少使用一个限制量词。