如何从以下字符串“提取”邮政编码(美国)?
import re
address = "Moab, UT 84532"
postal_code = re.match('^\d{5}(-\d{4})?$', address)
print postal_code
答案 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)