2016-04-10 32 views
0

我知道\ b可以表示單詞的開始或結尾。什麼時候會被要求代表結局?我問,因爲它似乎總是有必要指出單詞的結尾,因此不需要有\ 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)\ s +(\ b \ w + \ b)',第二種情況是'(\ 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)) 

產地:

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

注意如何追趕詞尾只有\s最終丟失了一大半。

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') 

...第一\b是必要的,以防止比賽開始,在beginin。第二個是多餘的,因爲你明確地匹配了單詞後面的非單詞字符(\s+)。單詞邊界適用於你不知道對方角色會是什麼樣的情況,或者即使那裏會有角色。

你在哪裏應該正在使用另一個是在正則表達式的結尾。例如:

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運算符存在於正式語言的解析器中。

這意味着它不處理常見的自然語言的情況,如:

讓我們變成兩句話,「讓」 &「S」如果'\ b」表示一個字的邊界。也考慮像這樣的標題&夫人先生失去他們的期限。

同樣,如果'\ b「表示單詞的開始,那麼在這些情況下,appostrophe將會丟失:」傻樣「回合」事業

聯用的話,在`\ B的手挨「還有,如岳母(除非你想讓她受苦。)

不幸的是,你不能簡單地將其包含在設置,因爲它不代表一個字符的字符增加\b。您可以通過在零寬度斷言中交替將它與其他字符組合。

使用自然語言時,\b運算符非常適合快速構思想法的原型,但最終可能不是您想要的。同上\w,但是,因爲它代表了角色,所以它更容易被增強。

相關問題