正则表达式获取美国邮政编码

时间:2011-09-15 04:29:15

标签: python regex

如何从以下字符串“提取”邮政编码(美国)?

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

4 个答案:

答案 0 :(得分:8)

首先,您使用匹配,它只匹配字符串的开头:请参阅http://docs.python.org/library/re.html#matching-vs-searching

此外,即使您使用搜索,也不会抓住包含保证在那里的5位数的组。

最后,即使您使用搜索,使用carat ^启动正则表达式也会强制它从头开始搜索,这显然不适用于您的情况。

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

答案 1 :(得分:5)

假设邮政编码总是5位数(美国的情况是不是?)

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

会做的。

关于匹配vs搜索的评论是正确的,如果我想要包含额外的4个字符:

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

应该这样做。

答案 2 :(得分:2)

你可以使用:

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

答案 3 :(得分:0)

这个适用于所有这些格式:

99999-9999

99999 9999

99999

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)& group(3)包含邮政编码的两个部分。我使用匹配,因为我将此应用于仅包含邮政编码的字段。对于这种情况,我还分别在开头和结尾添加了^ $。

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