免责声明:我仔细阅读了这篇帖子: 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"
你能帮忙吗?
答案 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%准确的东西,它会接受人们可能会对它们施加的任何变化。做大量的测试!祝你好运。