R:变宽后视的解决方法

问题描述 投票:1回答:2

给出此向量:

ba <- c('baa','aba','abba','abbba','aaba','aabba')'

我想将每个单词的最后a更改为i,除了baaaba

我写了下一行...

gsub('(?<=a[ab]b{1,2})a','i',ba,perl=T)

但被告知:[PCRE模式编译错误'在')a'处的后向断言'不是固定长度'

我环顾四周,显然R / Perl只能向前看可变宽度,而不能向后看。任何解决此问题的方法?谢谢!

regex r lookbehind
2个回答
3
投票

您可以改用后向替代\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"

0
投票

另一种解决方法仅针对当前情况,当使用的唯一量词是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后视中使用任何类型的模式,但很高兴知道,当您需要在已知距离范围内获取重叠文本时,可以在其中至少使用一个限制量词。

© www.soinside.com 2019 - 2024. All rights reserved.