代码之家  ›  专栏  ›  技术社区  ›  Joe

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

  •  2
  • Joe  · 技术社区  · 15 年前

    我希望能够从python的字符串中解析出city、state或zip。所以,如果我进入

    Boulder Co
    八万零三百零三
    科罗拉多州博尔德
    科罗拉多州博尔德,80303

    任何变化,它都会返回城市,州或邮政编码。

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

    5 回复  |  直到 14 年前
        1
  •  3
  •   Peter    15 年前

    只需询问他们的邮政编码,然后使用地理代码数据库给出一个(简短的)适用城市列表。这样你就能得到干净的5位数输入,节省时间,而且你们都回家很开心。

    如果您已经有了数据,只需查找zip,找到可能的城市列表(只有一个适用的州),并在将所有内容都小写后匹配城市名称。

        2
  •  3
  •   ars    15 年前

    您可以使用地理编码web服务或类似的东西。例如,在 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 在页面上指定。

        3
  •  1
  •   danben    15 年前

    我会用 ([^\d]+)?(\d{5})? 作为我的正则表达式,并使用 match 所以它只匹配字符串的开头。这样,它就不会因输入错误而失败,并能对其意图做出最佳猜测。然后可以在“,”上拆分第一个捕获组。

        4
  •  1
  •   Jason Culverhouse    14 年前
    1. easy_install ngram

    2. 生成文件,每行一个城市和州名称,放入city state.data 加利福尼亚州红木市 VA Redwood 等

    3. 实验(0.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),
    ...
    ]
    

    笔记: 因为这些是ngram,当这个州是城市ngram的一部分时,你可能会超过它。 也就是说,寻找“华盛顿”会让华盛顿得到比“华盛顿好”更好的分数

    你可能还想读 Using Superimposed Coding Of N-Gram Lists For Efficient Inexact Matching (PDF下载)

        5
  •  0
  •   Ryan Ginstrom    15 年前

    这段代码似乎可以满足您的需要:

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

    处理“南达科他州”和其他两个词的州/市留给读者的练习:)

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