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

4

如何从以下字符串中提取美国的邮政编码(zip code)?

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 - Prasanth
4个回答

9
首先,你正在使用match,它只会从字符串开头开始匹配:参见http://docs.python.org/library/re.html#matching-vs-searching 此外,即使你使用了search,也没有抓取包含5个数字的组。
最后,即使你使用了search,以插入符号^开头的正则表达式也会强制它从开头开始搜索,在你的情况下显然行不通。
>>> postal_code = re.search(r'.*(\d{5}(\-\d{4})?)$', address)
>>> postal_code.groups()
('84532', None)

Sberry,为什么在你的搜索模式中包含'.*'? '.*'不会匹配地址中的“Moab, UT”部分,因此搜索将最终匹配整个“Moab, UT 84532”吗?目前我没有带有Python的计算机,所以无法测试它。除此之外,您的模式看起来很准确,我喜欢它也可以捕获扩展邮政编码。 - Windle
这个正则表达式对于“-00000”会产生误报。 - nicomp

6
假设邮政编码始终为5位数(在美国是这样吗?)。
re.match('\d{5}$', address)

"会做。评论关于匹配与搜索是正确的,如果我想包括额外的4个字符:"
re.search('\d{5}(-\d{4})?$', address)

应该这样做。

我不同意。美国邮政编码可以包括额外的4位数字。此外,在这种情况下使用match将无法产生正确的结果,因为它将从字符串的开头开始匹配。 - sberry

2

您可以使用:

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

1

这个方法适用于以下所有格式:

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)

而group(1)和group(3)包含邮编的两个部分。由于我只适用于包含邮编的字段,因此使用match。我还在开头和结尾分别添加了^ $以符合这种情况。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接