从地址字符串中捕获城市、州和邮编的正则表达式

3

我试图编写一个正则表达式语句,只匹配地址中的城市、州和邮编部分。这里有一些我正在使用的地址示例。

3333 Josephine AVE #114 Temecula, CA 99999
11111 MERIT CIR #113 Laguna Hills, CA 99999

我目前有以下的模式。
[\,].*

但是这只捕获了逗号分隔城市和州之后的所有内容。

有没有一种方法可以捕获逗号之前的字符串[City],并且也适用于城市由两个单词组成的情况(例如洛杉矶)。

任何帮助都将不胜感激!提前致谢。


不可靠,没有捷径。当您拥有不规则或错误的数据时,最好重新生成CSV或某些可解析格式的数据。 - Todd A. Jacobs
4个回答

5

这个正则表达式将城市、州和邮政编码分别捕获在第1、2和3组中:

#\d+ ([^,]+), ([A-Z]{2}) (\d{5})

请查看实时演示


那个演示非常棒。谢谢你。我花了太多时间来尝试解决我所需的地址解析问题。 - DeadlyChambers

2

在正则表达式中,要捕获精确的状态是很困难的,或者说需要一个非常长的正则表达式。然而,我已经测试过了,这就是我的结果。

/([A-Z][a-z]+\s?)+,\s[A-Z]{2}\s\d{5}-?\d{4}?/

它匹配了这个

Gfdsdf Gfdsf, CA 43534

这里是细节: () - 这个捕获括起来的正则表达式 [A-Z] - 查找所有大写字母。 [a-z]+ - 后面跟着一个或多个小写字母。 \s? - 后面跟着一个可选的空格。 + - 这允许我们在城市名中有多个单词。 ,\s - 这紧随其后的是逗号和一个空格。 [A-Z]{2} - 国家ISO代码每个州都是两个字母。显然,在这个简单的例子中,它会包括虚假的州,但是如果不这样做,正则表达式就太长了。 \d{5} - 以五位数字邮政编码结尾。 -?\d{4}? - 可选匹配zip+4格式。它不是必需的。

ZIP+4呢? :) - Todd A. Jacobs
我不知道那是什么意思。 - Richard Hamilton
这是一个标准的美国格式,例如 12345-6789。并不是你的解决方案有问题,而是 OP 的语料库非常有限,不能代表真实世界的数据。整个问题是一个 X/Y 问题。 - Todd A. Jacobs
明白了。向这个正则表达式添加一个条件很容易。 - Richard Hamilton
我有点困惑为什么它不匹配FENTON, MO 63206。最后的ZIP+4部分应该是可选的,但是如果没有它,它就会失败... - undefined

1

只需要你的语料库中包含套房/公寓号码,你就可以使用以下方法:

$ echo '3333 Josephine AVE #114 Temecula, CA 99999
11111 MERIT CIR #113 Laguna Hills, CA 99999' |
pcregrep -o '#\d+ \K.*'
Temecula, CA 99999
Laguna Hills, CA 99999

然而,如果您有不规则的数据,不像CSV那样有明确定义的格式,您将会遇到问题。例如,街道名称中有两个或更多单词的地址,或者没有公寓号码的地址?
真正的解决方案是使用类似CSV的标准化格式重新生成您的数据。如果您无法这样做,则解析符合规范的数据(例如具有7个字段的行),然后仔细查看希望很小的剩余部分。

1

我相信有更好的方法来完成这个任务,但你可以尝试使用以下正则表达式:

(\d*)\s+((?:[\w+\s*-])+)[\,]\s+([a-zA-Z]+)\s+([0-9a-zA-Z]+)

第一组:公寓/房屋编号

第二组:城市(可能包含多个空格、下划线和破折号)

第三组:州/省代码

第四组:邮政编码(可能由字母和数字组成)

这将匹配以下所有情况: 3333 Josephine AVE#114 Temecula,CA 99

11111 MERIT CIR#113 Laguna Hills,CA 99999

11111 MERIT CIR#113 ddwwqs Laguna Hills,CA 99999

11111 MERIT CIR#113 sss ssss sss xs,CA 99999

11111 MERIT CIR#113 hkjkhuhuh,CAdsdsd T3B2R1

11111 MERIT CIR#113 dsadsa-ddasdas,CAdsdsd T2N21T

在这里查看演示:http://www.regexr.com/3cuds


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