从python中的字符串获取city,state或zip

时间:2010-01-13 04:32:15

标签: python regex string

我希望能够从python中的字符串中解析出城市,州或邮政编码。所以,如果我进入

Boulder,Co
80303个
博尔德,科罗拉多州 博尔德,Co 80303
......

这些的任何变化都将返回城市,州或邮编。

这都是用户输入的数据并输入到一个文本字段中。

5 个答案:

答案 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)

  1. easy_install ngram

  2. 使用所有城市和州名称构建文件,每行一个,放在citystate.data中 红木城,加利福尼亚州 弗吉尼亚州雷德伍德 等

  3. 实验(.2门槛稍微宽松)


  4. 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'}

处理“南达科他州”和其他两个字的州/城市作为读者的练习:)

正如其他海报所建议的那样,你可以变得聪明并使用邮政编码来缩小城市/州的范围。