2016-11-25 9 views
2

を含むgrepの正規表現を探しています。の単語が数字またはアンダースコアで区切られています。 \\bは、境界ではなく、単語の一部として数字とアンダースコアを考慮します。RのGrepでカスタムの "拡張"境界を持つ単語を探す

例えば、私はマウスを "犬のマウス猫"、 "犬のマウス:猫"、 "犬の猫の猫"、そして "マウス9CAT"のように、と "DOG_MOUSE"。基本的に、私が探している境界線は、大文字でないアルファベット文字に行/式の先頭と末尾を加えたものです(ここでは\\bで捕捉された他のいくつかのケースがないかもしれません)。

私が試してみた:それらの

"[[0-9_]\\b]MOUSE[[0-9_]\\b]" 
"[[0-9_]|\\b]MOUSE[[0-9_]|\\b]" 
"[$|[^A-Z]]MOUSE[^|[^A-Z]]" 
"[?<=^|[^A-Z]]MOUSE[?=$|[^A-Z]]" 

どれも動作しません。

\\bは私にとって厳しすぎるので、別の区切り文字で)最終的な結果は

grep(paste("\\b", paste(searchwords, collapse = "\\b|\\b"), "\\b"), targettext) 

のようになりますので、私は実際には、(値の長いベクトルに基づいて)いくつかの単語を探しています

(これは、ここでコメントでユーザーニックSabbeので尋ねたものと類似の質問です:Using grep in R to find strings as whole words (but not strings as part of words)

答えて

1
前後参照して

使用PCRE正規表現:

grep("(?<![A-Z])MOUSE(?![A-Z])", targettext, perl=TRUE) 

regex demo

ザ・を参照してください。 (?<![A-Z])負のlookbehindは、単語に大文字のASCII文字が前に付いていて、負の先読み(?![A-Z])がその単語の後にu大文字のASCII文字。

あなたが持っているすべての選択肢にルックアラウンドを適用するには、外側のグループ(?:...|...)を使用します。

R online demoを参照してください:

> targettext <- c("DOG MOUSE CAT","DOG MOUSE:CAT","DOG_MOUSE9CAT","MOUSE9CAT","DOG_MOUSE") 
> searchwords <- c("MOUSE","FROG") 
> grep(paste0("(?<![A-Z])(?:", paste(searchwords, collapse = "|"), ")(?![A-Z])"), targettext, perl=TRUE) 
[1] 1 2 3 4 5 
+0

ファンタスティック!どうもありがとうございます。これは実際に私のデータ(非常に長い)で\\ bと同じ結果を返しますが、私の信頼水準はあなたのおかげで増えました:) – syre

+0

'\ b'の意味はコンテキストに依存しますが、明確でカスタマイズ可能な境界。 –

関連する問題