2017-04-17 93 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! –