R中的否定前瞻不符合预期

时间:2017-04-17 19:48:29

标签: r regex

我正在尝试在我正在使用R的文本中替换以abc开头的字符串中的实例。输出文本在HTML中突出显示几次,所以我需要替换为忽略HTML插入符内的文本。

以下似乎在Python中有效,但我在R中的正则表达式上没有任何点击。所有帮助都赞赏。

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

预期产出:

xxxdef xxx<span abc>defabc xxxdef</span> xxx defabc

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

1 个答案:

答案 0 :(得分:4)

您需要删除不必要的转义并使用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"

请参阅online R demo

当您转义(时,它会与文字(符号匹配,因此,在您的模式中,\\(?![^<]*>\\)匹配( 1或0次,然后{{1然后是!以外的0 +字符,然后是<和文字>。在我的正则表达式中,如果)后面跟着(?![^<]*>)以外的任何0 +字符,然后是abc,则<是否会导致匹配失败。

如果没有>,则R perl=TRUE使用不支持外观的TRE正则表达式风格(甚至是前瞻性)。因此,您必须通过gsub告诉gsub您希望使用PCRE引擎。

请参阅online PCRE regex demo