2011-09-15 74 views
2

如何從下面的字符串「提取」郵政編碼(美國)?正則表達式讓我們郵編

import re 
address = "Moab, UT 84532" 
postal_code = re.match('^\d{5}(-\d{4})?$', address) 
print postal_code 
+1

見鏈接[http://regexlib.com/REDetails.aspx?regexp_id=2](http://regexlib.com/REDetails.aspx?regexp_id=2) – Prasanth

回答

7

首先,您使用的匹配,這會從字符串的開頭只匹配:看到http://docs.python.org/library/re.html#matching-vs-searching

而且,即使你使用的搜索,你不抓住,其中包括5組數字保證在那裏。

最後,即使你使用搜索,用克拉開始你的正則表達式^將迫使它從一開始,這顯然不會工作你的情況進行搜索。

>>> postal_code = re.search(r'.*(\d{5}(\-\d{4})?)$', address) 
>>> postal_code.groups() 
('84532', None) 
+0

Sberry,你爲什麼包括搜索模式中的'。\ *'? '。\ *'是否與地址中的「Moab,UT」部分相匹配,因此搜索將最終匹配整個「」Moab,UT 84532「?目前無法使用python訪問計算機我不能測試它,除此之外,你的圖案看起來很好看,我也喜歡它可以捕捉到擴展的郵政編碼 – Windle

3

假設郵政編碼總是5位(是美國的情況下,是不是?)

re.match( '\ d {5} $',地址)

會做。

評論是正確的關於比賽VS搜索,如果我想包括額外的4個字符:

re.search( '?\ d {5}( - \ d {4})$',地址)

應該這樣做。

+0

我不同意,我們的郵政編碼可以包含額外的4位數字。這種情況下不會產生正確的結果,因爲它會從字符串的開頭相匹配。 – sberry

1

你可以使用:

postal_code = re.match('^.*?(\d+)$', address) 
if postal_code!=None: 
    print postal_code.group(1) 
0

這一個完全適用於所有這些格式:

99999-9999

address = '123 Main St, 12345-5678 USA' 
re.search('(\d{5})([- ])?(\d{4})?', address).groups() 

其結果是:( '12345', ' - ', '5678')

爲了獲得整個匹配,使用:

re.search('(\d{5})([- ])?(\d{4})?', address).group(0) 

和組(1)&組(3)包含的兩個部分郵政編碼。我使用的比賽,而不是因爲我將其應用到只包含郵政編碼的字段。我也在這個案例的開頭和結尾處分別添加了^ $。

zip_code = '12345-6655' 
re.match('^(\d{5})([- ])?(\d{4})?$', zip_code).group(0)