在文本中找到美国街道地址(最好使用Python正则表达式)
问题内容:
免责声明:我非常仔细地阅读了以下主题: 字符串中的街道地址搜索-
Python或Ruby
和许多其他资源。
到目前为止,对我没有任何帮助。
在这里,我正在寻找更多详细信息:
规则很宽松,我绝对不是在要求适用于所有情况的完美代码。只是几个简单的基本地址,并假设地址应采用以下格式:
a)街道编号(1 … N位数字);
b)街道名称:大写一个或多个单词;
b-2)(可选)最好加缩写词。“ S。”,“ N。”,“ E。”,“ W。”
c)(可选)单位/公寓/等可以是任意数量(包括空)的任意字符
d)街道“类型” :(“ st。”,“ ave。”,“ way”)之一;
e)城市名称:1个或多个大写单词;
f)(可选)状态缩写(2个字母)
g)(可选)邮政编码,可以是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):#re
magic#返回第一个地址(所有地址吗?);如果找不到任何内容,则返回None
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"
能否请你帮忙?
问题答案:
\d{1,4}( \w+){1,5}, (.*), ( \w+){1,5}, (AZ|CA|CO|NH), [0-9]{5}(-[0-9]{4})?
在此正则表达式中,您有一个太多的空格(在之前( \w+){1,5}
,该空格已经以1开头)。删除它,它与您的示例匹配。
我认为您无法假设会有“ 123单元”或类似的单元,或者可能有多个单元(例如“ Building A,apt
3”)。请注意,在您的初始正则表达式中,.
匹配,
可能会导致很长(且不需要的)匹配。您可能应该接受几个这样的组,但组的数量, (.*)
有所限制(例如,用代替(, [^,]{1,20}){0,5}
。
无论如何,您可能永远不会获得100%准确的信息,不会接受任何人可能向他们投掷的变化。做很多测试!祝好运。