我正在尝试替换以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。
您需要删除不必要的转义并使用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 正则表达式演示。