【发布时间】:2013-08-21 21:33:01
【问题描述】:
免责声明:我非常仔细地阅读了这个帖子: 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(文本): # re 有魔法吗 # 返回第一个地址(所有地址?)如果没有找到,则返回 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"
你能帮忙吗?
【问题讨论】:
-
看看 PLY 是否有类似的东西......我怀疑正则表达式是否足够好
-
谢谢 Joran,我需要考虑 PLY。似乎为 nltk.ne_chunk 创建规则的曲线更陡峭,但谁知道:-)。无论如何谢谢!顺便说一句:为什么正则表达式不够好?我不需要超过 90% 的召回率.....
标签: python regex postal-code