2017-04-17 102 views
2

我试图用我在R中工作的文本中以abc开头的字符串替换实例。输出文本在HTML中通过几次传递突出显示,所以我需要更换忽略HTML内容中的文本。R中的负向前瞻不像预期的那样

以下似乎在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

记住http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags – MichaelChirico

回答

3

您需要删除不必要的脱离,而且使用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次,然后!,然后0 +字符以外的<,然后>和文字)。在我的正则表达式中,(?![^<]*>)是一个负面的前瞻,如果一个abc后跟除<之外的任何0+字符,然后是>,则比赛失败。

没有perl=TRUE,R gsub使用TRE正则表达式不支持lookarhead(甚至超前)。因此,您必须通过perl=TRUE告诉gsub您希望使用PCRE引擎。

查看online PCRE regex demo

+0

>您需要删除不必要的逃逸 !@#$ @ #!%% Thanks Wiktor! –