2011-08-01 99 views
9

我有一個功能吐出「華盛頓特區,美國」作爲輸出。我需要捕捉「華盛頓特區」,這是因爲我處理國內其他任何一個城市的原因。 (注意:這是而不是與「DC」相同,我需要逗號在「華盛頓」和「DC」之間,空格不錯)如何在Python正則表達式中匹配但不捕獲?

我不能爲我的生活弄清楚如何捕捉這個。

這是我已經試過:

>>>location = "Washington D.C., DC, USA" 

    >>>match = re.search(r'\w+\s(?:D\.C\.), \w\w(?=\W)', location).group() 
    >>>match 
    u'Washington D.C., DC' 

是不是(?:...)應該只是比賽(而不是捕捉) 「特區」?

這裏是2.7.2文檔:

(?:...) 定期括號的非捕獲版本。匹配括號內的任何正則表達式,但匹配的子字符串在執行匹配或稍後引用模式後無法檢索。

什麼給?

在此先感謝!

回答

9

這確實是一個聰明的方法,但不是捕獲並不意味着從匹配中刪除它。這只是說,它不被視爲一個輸出組。

你應該嘗試做同樣的事情到以下幾點:

match = re.search(r'(\w+)\s(?:D\.C\.), (\w\w)\W', location).groups() 

這將打印('Washington', 'DC')

請注意.group().groups()之間的差異。前者給你整個匹配的字符串,後者只是被捕獲的組。記住,你需要在輸出中指定你想要的內容,包括,而不是你想要排除的內容。

5
matches = re.search(r'(\w+\s)(?:D\.C\.)(, \w\w)(?=\W)', location).group(1,2) 
match = ''.join(matches) 

當它說它是「非捕獲」,這意味着它不會爲它創建一個單獨的捕獲組。文本「D.C.」仍然在比賽中。見http://docs.python.org/library/re.html#match-objects

+0

對,我認爲OP的真正問題是沒有參數的'group()'返回匹配的整個字符串。除了用args調用'group()'外,另一種使用python的方法是調用groups()並捕獲子匹配(這將正確排除「D.C.」 – Hoons

0

我遲到了,前兩個答案很好,但如果有任何機會,您需要一個將城市拉出城市,後綴,州/省和國家組合的普通正則表達式,但您知道DC是一個惱人的特殊情況下,您可能能夠使用以下命令:

>>> import re 
>>> city = re.compile(r'(\w+(?:\sD\.C\.)?), \w\w(?=\W)') 
>>> location = "Washington D.C., DC, USA" 
>>> re.search(city, location).group(1) 
'Washington D.C.' 
>>> location = "Vancouver, BC, Canada" 
>>> re.search(city, location).group(1) 
'Vancouver' 

的DC部分由可選的(因爲你並不總是需要它)除了作爲非捕獲(以節省內存)。

相關問題