我有一个csv文件,地址包括',',空格,数字。我还有另外两个城市和邮政编码的文件。我想读取地址文件并提取城市名称和邮政编码。正如您将在下面看到的,这些地址没有简单的模式,并且随机地散布着“,”空格等。下面是一个例子。
地址文件
加州河滨路123号河滨大道12034
加州圣克拉拉93453
门罗大道231号,或
奥法伦神秘湾43号,邮编63045
城市档案
河边
奥法伦
圣克拉拉
摩根敦
邮政编码文件
02343号
二万三千四百五十四
一万二千零三十四
九万三千四百五十三
两列中的预期输出文件(对应于输入地址文件)
城市邮编
河边12034
圣克拉拉93453
失踪
奥法伦失踪
请注意,匹配不应区分大小写。我对R比较熟悉,但是我也很乐意使用python中的任何帮助。
提前谢谢你。

最佳答案

你可以考虑用这样的方法,尽管要小心——有很多事情可能会出错。例如,
“12034滨河路”会被误解为滨河城,其邮政编码为12034。
避免这种错误的一种方法是枚举地址可以采用的所有形式,然后使用pyparsing或regex尝试匹配这些形式。
下面代码的另一个问题是它形成了两个可能巨大的regexp(如果zipcode和/或city文件非常大)。我不知道在这种情况下代码会如何运行。如果这证明是个问题,我们可以考虑如何重新编写代码。

import re
import itertools as it

with open('zipcode','r') as z:
    zipcode_pat=re.compile('({0})'.format('|'.join(line.rstrip() for line in z)),
                        re.IGNORECASE)
with open('city','r') as c:
    city_pat=re.compile('({0})'.format('|'.join(line.rstrip() for line in c)),
                      re.IGNORECASE)

def gitone(seq):
    for match in seq:
        if match:
            yield match.group(1)
        else:
            yield 'Missing'

with open('address','r') as f:
    f1,f2=it.tee(f,2)
    zipcodes=gitone(zipcode_pat.search(line) for line in f1)
    cities=gitone(city_pat.search(line) for line in f2)
    for city,zipcode in it.izip(cities,zipcodes):
        print('{c} {z}'.format(c=city,z=zipcode))

# Riverside 12034
# Santa clara 93453
# Missing Missing
# O'Fallon Missing

10-05 21:00