RegEx地址解析城市

时间:2013-07-01 18:40:26

标签: regex

在我们的数据库中,我们有1个“地址”字段,用于将完整地址存储为文本。我正在将地址拆分为以下字段:Line1,City,State,Zip。 (美国地址)。我有很好的表达式来解析状态和zip,但我在解析这个城市时遇到了一些困难。

基本上,我使用以下规则来解析城市:

  • 它必须在州之前
  • 它可以有一个逗号或两个或多个空格。
  • 如果以上都不是真的,那么只需返回状态之前的1个单词。

我对验证这些地址不感兴趣。

这是我一直在使用的RegEx的一个例子,它非常适合解析用逗号或超过2个空格分隔的地址组件,但如果我尝试包含它,我就无法工作1个序言的替代词:

样本地址:1977 S. Joshua Tree PL,Palm Springs,CA 92264

(?ⅰ)?

*(((((\ S | \ S {2,})\ W +)+(\ S \ W +)))(=(,\ S + |?\ S +)(阿拉巴马|阿拉斯加|亚利桑那|阿肯色|加利福尼亚|科罗拉多|康涅狄格|特拉华州|佛罗里达|佐治亚|夏威夷|爱达荷|伊利诺伊|印第安纳|衣阿华|堪萨斯|肯塔基|路易斯安那|缅因|马里兰|马萨诸塞|密执安|明尼苏达|密西西比|密苏里|蒙大拿州|内布拉斯加州|内华达州|新罕布什尔州|新泽西州|新墨西哥州|纽约州|北卡罗来纳州|北达科他州|俄亥俄州|俄克拉荷马州|俄勒冈州|宾夕法尼亚州|罗德岛州|南卡罗来纳州|南达科他州|田纳西州|德克萨斯州|犹他州|佛蒙特州|弗吉尼亚州|华盛顿|西弗吉尼亚州|威斯康星州| AL | AK | AZ | AR | CA | CO | CT | DE | FL | GA | HI | ID | IL | IN | IA | KS | KY | LA | ME | MD | MA | MI | MN | MS | MO | MT | NE | NV | NH | NJ | NM | NY | NC | ND | OH |行|或| PA | RI | SC | SD | TN | TX | UT | VT | VA | WA | WV | WI | WY)))

尝试使第一个单词可选使得表达式仅返回“Springs”,而不是“Palm Springs”,它在上面的表达式中肯定匹配: (?I)?*(((((\ S | \ S {2,})\ W +)的 (\ S \ W +)))(=(\ S +?| \ S +)

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

就个人而言,我认为我会采取完全不同的方法。我会将邮政编码视为权威,因为它是您提供的最精细的数据。我会得到一个城市映射的邮政编码列表。提取地址的邮政编码部分。根据邮政编码在新数据库字段中写入城市和州的值。然后编写一个脚本来浏览每个数据条目,并确定是否可以在字符串中找到基于邮政编码的城市和州名称。如果可以,请从字符串中删除这些值。并将该记录标记为已成功处理。如果他们无法将记录标记为您可能需要执行人工审核的记录。

另一种替代方法可能是使用Google地图等API,将您的地址字符串发送到,并希望获得一个已清理过的地址。

答案 1 :(得分:1)

这可能过于宽泛,但它可能适合您,具体取决于您使用的正则表达式实现:

(.+?),\s*(.+?)(?:,\s|\s\s)(.+?)\s(\d{5})

这将返回示例中的以下组:

('1977 S. Joshua Tree PL', 'Palm Springs', 'CA', '92264')

答案 2 :(得分:-1)

我总是更喜欢这样的命名捕获组。所以试试

(?<addr>[^,]+),\s+(?<city>[^,]+),\s+(?<state>[A-Za-z]{2})\s+(?<zip>\d{5}(-\d{4})?)

解析你的例子,这将给你

  • addr:1997 S. Joshua Tree PL
  • 城市:棕榈泉
  • 州:CA
  • zip:92264

我也支持扩展的邮政编码格式。

您只需从此正则表达式生成的匹配项中提取城市组的值即可。