reモジュールの正規表現は単語境界(\ b)をサポートしていますか?


100

正規表現についてもう少し学習しようとしているときに、チュートリアルでを使用し\bて単語の境界を一致させることができると提案されました。ただし、Pythonインタープリターの次のスニペットは期待どおりに機能しません。

>>> x = 'one two three'
>>> y = re.search("\btwo\b", x)

何かが一致した場合、それは一致オブジェクトであるはずですが、そうですNone

された\b表現は、Pythonでサポートされていないか、私はそれが間違って使用していますか?


31
これは機能します:re.search(r"\btwo\b", x)
Bolo

5
「生の」文字列を使用しないのはなぜですか? r"\btwo\b"
S.Lott、

3
人々はしばしば混乱してい\bます。
tchrist

はい、 Pythonはありますr'\b'。文字がエスケープされるようにraw文字列が必要です。(または、それをダブルエスケープします\\b。これはyukkyです)
smci

回答:


85

やってみませんか

word = 'two'
re.compile(r'\b%s\b' % word, re.I)

出力:

>>> word = 'two'
>>> k = re.compile(r'\b%s\b' % word, re.I)
>>> x = 'one two three'
>>> y = k.search( x)
>>> y
<_sre.SRE_Match object at 0x100418850>

また、言及するのを忘れて、コードでは生の文字列を使用する必要があります

>>> x = 'one two three'
>>> y = re.search(r"\btwo\b", x)
>>> y
<_sre.SRE_Match object at 0x100418a58>
>>> 

興味深い、実際の例に感謝します。私が選択した方法が機能しない理由について何か洞察がありますか?2つのアプローチは同じでなければなりませんが、あなたのアプローチでは、コンパイルは1回だけです。
DC

1
@darren:あなたがしたことを改善する私の最後の例を見てください。検索用に生の文字列を提供しました。
pyfunc

1
ああ、あなたとBoloの提案の後、それは私が生の文字列を使用していなかったからです。ありがとう!
DC

9
-1:後方。生の文字列を最初にする必要があります。文字列%置換を使用してre式を作成するもう1つのビジネスは、この特定の質問とは関係のない悪い接線です。
S.Lott、

2
悪い答え。コードは機能しますが、説明はまったくありません。
Aran-Fey

88

これは動作します: re.search(r"\btwo\b", x)

"\b"Pythonで書くときは、1文字です"\x08"。次のようにバックスラッシュをエスケープします。

"\\b"

または、次のような生の文字列を記述します。

r"\b"

4
これは本当に役に立ちました...私はpyspark rlike正規表現で苦労していて、\ b(単語の境界)が機能しない理由を理解できませんでした。ありがとう
jb1t 2016年

17

なぜ re.search("\btwo\b", x)うまくいかないのを明確に説明するため\bに、Pythonの文字列はバックスペース文字の省略形だからです。

print("foo\bbar")
fobar

したがって、パターン"\btwo\b"はバックスペースを探し、その後にが続きtwo、その後に別のバックスペースが続きますx = 'one two three'

re.search(またはcompile)がシーケンス\bを単語の境界として解釈できるようにするには、バックスラッシュをエスケープする("\\btwo\\b")か、未加工の文字列を使用してパターンを作成する(r"\btwo\b")。


10

Pythonのドキュメント

https://docs.python.org/2/library/re.html#regular-expression-syntax

\ b

空の文字列に一致しますが、単語の最初または最後のみが一致します。単語は、英数字またはアンダースコア文字のシーケンスとして定義されるため、単語の終わりは、空白または英数字以外のアンダースコア文字で示されます。正式には、\ bは\ wと\ W文字(またはその逆)の間、または\ wと文字列の先頭/末尾の間の境界として定義されるため、英数字と見なされる文字の正確なセットは、 UNICODEおよびLOCALEフラグの値。たとえば、r '\ bfoo \ b'は、「foo」、「foo。」、「(foo)」、「bar foo baz」に一致しますが、「foobar」または「foo3」には一致しません。文字範囲内では、\ bはPythonの文字列リテラルとの互換性のためにバックスペース文字を表します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.