在文本中找到美国街道地址(最好使用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%准确的信息,不会接受任何人可能向他们投掷的变化。做很多测试!祝好运。