以文本形式显示美国街道地址(最好使用Python正则表达式)

时间:2013-08-21 21:33:02

标签: python regex postal-code

免责声明:我仔细阅读了这篇帖子: Street Address search in a string - Python or Ruby 和许多其他资源。

到目前为止,对我来说没有任何作用。

在这里,我正在寻找的更多细节是:

规则很放松,我绝对不是要求一个涵盖所有案例的完美代码;只是一些简单的基本假设,地址应采用以下格式:

  

a)街道号码(1 ... N位数);

     

b)街道名称:一个或多个单词大写;

     如果它可以以缩写为前缀,那么

b-2)(可选)将是最好的。 “S.”,“N。”,“E。”,“W。”

     

c)(可选)单位/公寓/等可以是任意(包括空)数量的任意字符

     

d)街道“类型”:(“st。”,“ave。”,“way”)之一;

     

e)城市名称:1个或更多大写词;

     

f)(可选)州名缩写(2个字母)

     

g)(可选)zip,任意5位数。

上述所有内容都不一定是有效的(例如现有的城市或邮政编码)。

到目前为止,我正在尝试这样的表达式:

  
    
      

pat = re.compile(r'\ d {1,4}(\ w +){1,5},(。*),(\ w +){1,5},(AZ | CA | CO | NH),[0-9] {5}( - [0-9] {4})?',re.IGNORECASE)

    
  
>>> pat.search("123 East Virginia avenue, unit 123, San Ramondo, CA, 94444")

不要工作,对我来说理解原因并不容易。具体来说:我如何在我的模式中将一组任何单词与应该遵循的特定单词分开,如州名缩写。或街道“类型(”st。,ave。)?

无论如何:这是我希望得到的一个例子: 特定     def ex_addr(text):         #做了魔法         #返回第一个地址(所有地址?)或如果没有找到则返回

for t in [
'The meeting will be held at 22 West Westin st., South Carolina, 12345 on Nov.-18',
'The meeting will be held at 22 West Westin street, SC, 12345 on Nov.-18',

'Hi there,\n How about meeting tomorr. @10am-sh in Chadds @ 123 S. Vancouver ave. in Ottawa? \nThanks!!!',
'Hi there,\n How about meeting tomorr. @10am-sh in Chadds @ 123 S. Vancouver avenue in Ottawa? \nThanks!!!',

'This was written in 1999 in Montreal',

"Cool cafe at 420 Funny Lane, Cupertino CA is way too cool",

"We're at a party at 12321 Mammoth Lane, Lexington MA 77777; Come have a beer!"
] print ex_addr(t)

我想得到:

'22 West Westin st., South Carolina, 12345'
'22 West Westin street, SC, 12345'
'123 S. Vancouver ave. in Ottawa'
'123 S. Vancouver avenue in Ottawa'
None # for 'This was written in 1999 in Montreal',
"420 Funny Lane, Cupertino CA",
"12321 Mammoth Lane, Lexington MA 77777"

你能帮忙吗?

2 个答案:

答案 0 :(得分:6)

我刚刚在GitHub遇到过这个问题,因为我遇到了类似的问题。看起来比现有的解决方案更有效。

https://github.com/madisonmay/CommonRegex

查看代码,街道地址的正则表达式可以解决更多场景。 ' \ d {1,4} [\ w \ s] {1,20}(?: street | st | avenue | ave | road | rd | highway | hwy | square | sq | trail | trl | drive |博士|法院|克拉|林荫道| PKWY |圆| CIR |大道| BLVD)\ W(= \ S | $)'?

答案 1 :(得分:2)

\d{1,4}( \w+){1,5}, (.*), ( \w+){1,5}, (AZ|CA|CO|NH), [0-9]{5}(-[0-9]{4})?

在这个正则表达式中,你有一个太多的空格(在( \w+){1,5}之前,它已经以一个开头)。删除它,它符合您的示例。

我认为你不能认为“单位123”或类似物会在那里,或者可能有几个(例如“建筑物A,适合3”)。请注意,在您的初始正则表达式中,.可能与,匹配,这可能导致非常长(和不需要的)匹配。 你可能应该接受几个这样的群体,但这些群体的数量有限制(例如,用, (.*)替换(, [^,]{1,20}){0,5}

在任何情况下,你可能永远不会得到100%准确的东西,它会接受人们可能会对它们施加的任何变化。做大量的测试!祝你好运。