R 中的负前瞻未按预期运行

Ric*_*Ard 6 regex r

我正在尝试替换以abc我在 R 中使用的文本开头的字符串中的实例。输出文本在 HTML 中经过几次高亮显示,因此我需要替换以忽略 HTML 插入符号中的文本。

以下似乎在 Python 中工作,但我在 R 中的正则表达式没有得到任何点击。感谢所有帮助。

test <- 'abcdef abc<span abc>defabc abcdef</span> abc defabc'
gsub('\\babc\\(?![^<]*>\\)', 'xxx', test)
Run Code Online (Sandbox Code Playgroud)

预期输出:

xxxdef xxx<span abc>defabc xxxdef</span> xxx defabc
Run Code Online (Sandbox Code Playgroud)

相反,它忽略了 的所有实例abc

Wik*_*żew 7

您需要删除不必要的转义并使用perl=TRUE

test <- 'abcdef abc<span abc>defabc abcdef</span> abc defabc'
gsub('\\babc(?![^<]*>)', 'xxx', test, perl=TRUE)
## => [1] "xxxdef xxx<span abc>defabc xxxdef</span> xxx defabc"
Run Code Online (Sandbox Code Playgroud)

查看在线 R 演示

当您转义时(,它匹配一个文字(符号,因此,在您的模式中,\\(?![^<]*>\\)匹配(1 次或 0 次,然后!,然后是 0+ 个字符<>而不是, then和文字)。在我的正则表达式中,(?![^<]*>)如果 anabc后跟除<a之外的任何 0+ 个字符,则它是一个否定前瞻,匹配失败>

没有perl=TRUE,Rgsub使用不支持环视(甚至超前)的 TRE 正则表达式风格。因此,您必须告诉gsubviaperl=TRUE您希望使用 PCRE 引擎。

请参阅在线 PCRE 正则表达式演示