我正在尝试在我正在使用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
的所有实例。
答案 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"
当您转义(
时,它会与文字(
符号匹配,因此,在您的模式中,\\(?![^<]*>\\)
匹配(
1或0次,然后{{1然后是!
以外的0 +字符,然后是<
和文字>
。在我的正则表达式中,如果)
后面跟着(?![^<]*>)
以外的任何0 +字符,然后是abc
,则<
是否会导致匹配失败。
如果没有>
,则R perl=TRUE
使用不支持外观的TRE正则表达式风格(甚至是前瞻性)。因此,您必须通过gsub
告诉gsub
您希望使用PCRE引擎。