我希望能够从python中的字符串中解析出城市,州或邮政编码。所以,如果我进入
Boulder,Co
80303个
博尔德,科罗拉多州
博尔德,Co 80303
......
这些的任何变化都将返回城市,州或邮编。
这都是用户输入的数据并输入到一个文本字段中。
答案 0 :(得分:3)
只询问他们的拉链,然后使用地理编码数据库提供适用城市的(简短)列表。通过这种方式,您可以获得干净的5位数输入,他们可以节省时间,并且您都可以快乐回家。
如果您已有数据,请查看zip,查找可能的城市列表(只有一个适用的州),并在将所有内容设为小写后匹配城市名称。
答案 1 :(得分:3)
您可以使用地理编码网络服务或类似的东西。例如,在Yahoo geocoding API页面上,它显示了如何以多种方式指定地址:
This free field lets users enter any of the following:
city, state
city, state, zip
zip
street, city, state
street, city, state, zip
street, zip
并且XML结果提供解析的地址,例如在页面上指定此test URL。
答案 2 :(得分:1)
我会使用([^\d]+)?(\d{5})?
作为我的正则表达式,并使用match
因此它只匹配字符串的开头。通过这种方式,它不会因输入错误而失败,并会对预期内容做出最佳猜测。然后,您可以将第一个捕获组拆分为“,”。
答案 3 :(得分:1)
easy_install ngram
使用所有城市和州名称构建文件,每行一个,放在citystate.data中 红木城,加利福尼亚州 弗吉尼亚州雷德伍德 等
实验(.2门槛稍微宽松)
import string
import ngram
cityStateParser = ngram.NGram(
items = (line.strip() for line in open('citystate.data')) ,
N=3, iconv=string.lower, qconv=string.lower, threshold=.2
)
示例强>:
cityStateParser.search('redwood')
[('Redwood VA', 0.5),
('Redwood NY', 0.5),
('Redwood MS', 0.5),
('Redwood City CA', 0.36842105263157893),
...
]
注意: 因为这些是NGrams,当州是城市中的ngram的一部分时,你可能会得到超越 即搜索“华盛顿”将获得华盛顿IN,其得分低于“华盛顿OK”
您可能还需要阅读Using Superimposed Coding Of N-Gram Lists For Efficient Inexact Matching(PDF下载)
答案 4 :(得分:0)
此代码似乎可以满足您的需求:
text = """
Boulder, Co
80303
Boulder, Colorado
Boulder, Co 80303
"""
lines = text.splitlines()
ABBREV = dict(co="Colorado", ca="California")
STATES = ABBREV.values()
def parse_addr(line):
addr = {}
# normalize commas
parts = line.replace(",", " ").split()
for part in parts:
if part.capitalize() in STATES:
addr["state"] = part
elif part.lower() in ABBREV:
addr["state"] = ABBREV[part.lower()]
else:
try:
zip = int(part)
addr["zip"] = part
except ValueError:
addr["city"] = part
return addr
for line in lines:
print line, parse_addr(line)
输出:
Boulder, Co {'city': 'Boulder', 'state': 'Colorado'}
80303 {'zip': '80303'}
Boulder, Colorado {'city': 'Boulder', 'state': 'Colorado'}
Boulder, Co 80303 {'city': 'Boulder', 'state': 'Colorado', 'zip': '80303'}
处理“南达科他州”和其他两个字的州/城市作为读者的练习:)
正如其他海报所建议的那样,你可以变得聪明并使用邮政编码来缩小城市/州的范围。