2017-04-17 6 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正規表現フレーバを使用します。したがって、PCREエンジンを使用することをperl=TRUEgsubに伝える必要があります。

online PCRE regex demoを参照してください。

+0

>あなたは、不要なエスケープ を削除する必要があります!@#$ @念頭に置いておきます#!%% ありがとうウィクショー! –

関連する問題