2017-09-18 95 views
1

我有以下的小Python腳本:我的單詞邊界正則表達式有什麼問題?

import re 

def main(): 
    thename = "DAVID M. D.D.S." 
    theregex = re.compile(r"\bD\.D\.S\.\b") 
    if re.search(theregex, thename): 
     print ("you did it") 
main() 

它不匹配。但是,如果我稍微調整正則表達式並刪除最後一個。它確實工作,像這樣:

\bD\.D\.S\b 

我覺得我很瞭解正則表達式,但這一直很困惑。我對\ b(單詞邊界)的理解應該是非字母數字(和下劃線)的零寬度匹配。所以,我希望

"\bD\.D\.S\.\b" 

匹配:

D.D.S. 

我缺少什麼?

+1

檢查無字避免雙用'R'逃逸\ bD \ .D \ .S \。\ b;''但'\ b'(單詞邊界)不能在點之後進行匹配,因爲點是非單詞字符。 – anubhava

+0

這是否意味着我只能使用\ b旁邊的單詞字符?所以如果我有「超!」我不能有一個正則表達式「hyper!\ b」 – sniperd

+1

是的,因爲單詞已經在'!'結束了。 '\ b'可以用來聲明'hyper'和'!'之間的位置 – anubhava

回答

1

這不符合您的想法。

r"\bD\.D\.S\.\b" 

下面是一個explanation of that regex,用下面列出的相同的例子:

D.D.S. # no match, as there is no word boundary after the final dot 
D.D.S.S # matches since there is a word boundary between `.` and `S` at the end 

字邊界是字字符(\w,這是[0-9A-Za-z_]加上其他「字母」之間的零寬度匹配器作爲由您的語言環境定義)和非單詞字符(\W,這是前一類的反轉)。點(.)不是一個單詞字符,因此  D.D.S.  (注意尾隨空格)在下列位置有單詞邊界(僅限!):  \bD\b.\bD\b.\bS\b.  (我沒有逃過這個點,因爲我正在說明單詞邊界,而不是正則表達式)。

我假設你正試圖匹配行尾或空白。有兩種方法可以做到這一點:

r"\bD\.D\.S\.(?!\S)" # by negation: do not match a non-whitespace 
r"\bD\.D\.S\.(?:\s|$)" # match either a whitespace character or end of line 

我精製上述正則表達式的解釋鏈接explain the negation example above(注意…/1第一端,而在…/2第二端;隨意進一步體驗,在那裏,它是好的和互動)。

+0

謝謝你的詳細描述。每當我想我有正則表達式想通了,我偶然發現了這樣的:) – sniperd

+0

「單詞邊界是單詞字符之間的零寬度匹配器」這是否意味着這永遠不會有意義:「!\ b!「因爲\ b的任何一邊都不是一個單詞字符?如果是這樣的話,這一切都會變得清晰起來 – sniperd

+1

'\ b'是一個零寬度匹配器,因此它匹配'D'和'之間的邊界。 ''在D.'沒有消耗任何寬度。你是對的:正則表達式'!\ b!'保證失敗,因爲在兩個感嘆號之間不可能有字邊界。 –

0
  • \.\b比賽.bla - 檢查字字符後.
  • \.\B相反比賽bla.但不bla.bla - 後.
\bD\.D\.S\.\B
+0

這也會匹配'DDS.',我不確定這是什麼意思。 –

相關問題