2016-11-26 22 views
2

どのように単語境界を正しく尊重するか?たとえば、... 'とではないが、部分一致を行い bのpythonのreと完全な単語の一致

negative look-ahead assertionを使用して
>>> import re 
>>> str = "This is a test's test" 
>>> p1 = r'\b' + 'test' + r'\b' 
>>> re.findall(p1,str) 
['test', 'test'] 
+3

あなたは何を意味するかを明確にする必要があります。 [ドキュメント](https://docs.python.org/2/library/re.html)で述べたように、「単語は英数字またはアンダースコア文字のシーケンスとして定義されているため、単語の末尾は空白文字または非英数字、アンダースコア以外の文字を含むことがあります。単語を他の方法で定義する場合は、\ bを使用して単語を定義することはできません。 – BrenBarn

+0

regexesのための '単語'文字は、ASCII文字、数字またはアンダースコアです: 'A-Za-z0-9_'。正規表現の "単語境界"は、英語の単語ではなく、 "単語の文字"と非 "単語の文字"の境界です。 – krock

答えて

4

を理解し、あなたは'が続かないtestのマッチングを保証することができます。

>>> import re 
>>> s = "This is a test's test" 
>>> re.findall(r"\btest\b(?!')", s) # match `test` as long as it is not followed by "'" 
['test'] 

ところで、strを変数名として使用しないでください。それは組み込み関数/タイプstrを陰にします。

+0

正規表現を以下の '\ btest(?!\ S)'に変更して、 'testing'の' test'と部分的に一致しないようにしてください。 – smac89

+0

@ smac89、 'test'の後に' \ b'があるので、 'testing'と一致しません。たとえば、 're.findall(r" \ btest \ b(?! ') "、" testing ")'は '[]'を返します。 – falsetru

関連する問題