2015-11-15 104 views
3

我想匹配一個可選結束句子'other (\\w+)'。例如,正則表達式應該如下匹配兩個句子並提取單詞'things':爲什麼我不能匹配python中正則表達式的最後部分?

  • 蘋果和其他東西。
  • 蘋果很大。

我寫了一個正則表達式,如下所示。但是,我得到了一個結果(None,)。如果我刪除最後的?。我會得到正確的答案。爲什麼?

>>> re.search('\w+(?: other (\\w+))?', 'A and other things').groups() 
(None,) 
>>> re.search('\w+(?: other (\\w+))', 'A and other things').groups() 
('things',) 
+0

因爲用「?「你在」事物「之後期待更多的單詞 – tanjir

+0

?導致產生的RE匹配前面RE的0或1個重複(來自python網站) – Zety

回答

1

正則表達式搜索的規則是它們產生的最匹配的最左邊的匹配。是的,如果可能的話,它會嘗試給你更長時間的比賽,但最重要的是,當它發現第一次成功比賽時,它將停止進一步尋找。

在第一個正則表達式中,\w+匹配的最左邊的點是A。可選部分與此不匹配,因此完成。

在第二個正則表達式中,括號表達式是強制性的,所以A不匹配。因此,它繼續尋找。 \w+匹配and,然後第二個\\w+匹配things


注意,在Python中的正則表達式,特別是那些包含反斜槓,它的使用r'raw strings'寫他們一個好主意。

2

如果你使用:

re.search(r'\w+(?: other (\w+))?', 'A and other things').group() 

你會看到發生了什麼。由於\w+之後的任何內容都是可選的,因此您的search匹配第一個詞A

作爲每official documentation

.groups()

返回包含匹配的所有亞組,從1到然而,許多基團是在圖案的元組。

而且你search調用不返回任何分組,因此您可以:

re.search(r'\w+(?: other (\w+))?', 'A and other things').groups() 
(None,) 

解決你的問題您可以使用此交替基於正則表達式:

r'\w+(?: other (\w+)|$)' 

例子:

>>> re.search(r'\w+(?: other (\w+)|$)', 'A and other things').group() 
'and' 
>>> re.search(r'\w+(?: other (\w+)|$)', 'The apple is big').group() 
'big' 
相關問題