2016-04-10 2 views
0

私は\ bが単語の先頭または末尾を表すことができることを理解しています。 \ bはいつ終わりを表現する必要がありますか?私は、単語の終わりを示すために常に\ sを持つ必要があると思われるので、\ bを持つ必要性を排除するので、尋ねています。下の例のように、内側のグループを終了するための '\ b'と、それ以外のものとは同じ結果を得ます。Python REは、単語の終わりを示すのに b便利です。

m = re.search(r'(\b\w+\b)\s+\1', 'Cherry tree blooming will begin in in later March') 
print m.group() 

m = re.search(r'(\b\w+)\s+\1', 'Cherry tree blooming will begin in in later March') 
print m.group() 
+1

「\ b」は単語境界を表し、単語の先頭または終わりだけではありません – rock321987

+0

'\ 1'は前回の捕捉されたグループを示します。したがって、最初の場合はそれ以上です(\ b \ w + (\ b \ w +)\ s +(\ b \ w +) '..です。したがって、単語の終わりにマーキングする' \ s'はありません.. – rock321987

答えて

2

\sは単なる空白です。空白(句読点など)ではなく、\bを使用する必要があるときに、単語の境界を設定することができます。空白で区切られた単語だけをマッチングさせる場合は、\sを使うことができます。その場合は\bは必要ありません。

import re 

sentence = 'Non-whitespace delimiters: Commas, semicolons; etc.' 
print(re.findall(r'(\b\w+)\s+', sentence)) 
print(re.findall(r'(\b\w+\b)+', sentence)) 

が生成されますちょうど\sと語尾をキャッチしようとしている方法を

['whitespace'] 
['Non', 'whitespace', 'delimiters', 'Commas', 'semicolons', 'etc'] 

お知らせは、それらのほとんどが欠けてしまいます。

2

単語 "行進" と一致したい考えてみましょう:

>>> regex = re.compile(r'\bmarch\b') 

それは...文の終わりに

>>> regex.search('I love march') 
<_sre.SRE_Match object at 0x10568e4a8> 

それとも最初に来ることができます...

>>> regex.search('march is a great month') 
<_sre.SRE_Match object at 0x10568e440> 

しかし、marchingなどと一致させたくない場合は、単語の境界が最も便利です:

>>> regex.search('my favorite pass-time is marching') 
>>> 

あなたが考えるかもしれない「しかし、私はr'\s+march\s+'を使用してこれらの事のすべてを取得することができます」と、あなたは親切の正しい...違いが一致したものの中にあります。 \s+では、一致する空白が含まれている可能性もあります(\s+の意味なので)。これにより、空白を以前と同じように保つように管理しなければならない可能性があるため、単語を検索して置き換えるなどの特定の処理を行うことができます。

1

単語の末尾にあるわけではありません。なぜなら、の後には、の後に来るものが分かるからです。あなたの例では:

m = re.search(r'(\b\w+\b)\s+\1', 'Cherry tree blooming will begin in in later March') 

...最初\bbegininで始まる試合を防止する必要があります。 2番目の単語は、単語に続く単語以外の文字(\s+)と明示的に一致しているため、冗長です。単語の境界は、相手側のキャラクターがどんなものになるか、そこにキャラクターが存在するかどうかわからない状況に適しています。

ここでの正規表現の最後にもう1つ使用する必要があります。たとえば:

m = re.search(r'(\b\w+)\s+\1\b', "Let's go to the theater") 

\bがなければ、あなたはthe theaterのための偽陽性になるだろう。

0
"I understand that \b can represent either the beginning or the end of a word. When would \b be required to represent the end?" 

\b単語の、終わり、あるいは始まりを表すためにを必要とされることはありません。より大きな質問に答えるには、開発中にのみ役立ちます。自然言語を使って作業する場合は、\bを別のものに置き換える必要があります。どうして?

\ b演算子は、検出したとおりの単語境界に一致します。しかし、ここでの重要なコンセプトは、「という単語とは何ですか?答えは非常に狭いセットです[A-Za-z0-9_] - 単語は自然言語ではなくコンピュータ言語の識別子です。 \ b演算子は、正式な言語のパーサに存在します。 `\ bは」単語の境界を表す場合、&の '「ましょう」

単語レッツ・なっ二つの単語を:

は、これは以下のように一般的な自然言語状況を処理しないことを意味します。 のようなタイトルも考えてみてください。& Mrs.は期間を失います。 `\ bがあれば

同様に、「単語の先頭を表し、これらのケースでappostropheは失われます:」のTWAS「」試合原因

ハイフンの単語が` \ bの手元に苦しみます"だけでなく、例えば義母(あなたが彼女に苦しむする場合を除き。)

残念ながら、あなたは、単にそれが文字を表していないと文字セットに含めて\bを強化することはできません。ゼロ幅アサーションで交互に他の文字と組み合わせることができます。

自然言語で作業する場合、\b演算子は、アイデアを素早くプロトタイプ作成するのに最適ですが、最終的には、おそらくあなたが望むものではないでしょう。 Ditto \wですが、文字を表しているため、より簡単に拡張できます。

関連する問題