Python邮政编码

时间:2017-03-12 17:56:54

标签: python regex zipcode

我对Python很陌生并努力执行我需要的东西 我需要从字符串中提取Zip代码" concat"。
我正在研究正则表达式,但我在功能方面苦苦挣扎。

import pandas as pd
import re
from pandas import ExcelWriter

我导入了CSV,编码文本类型的字符串上传问题,已建立的数据框列,并使其自己的df

Client = pd.read_csv("CLZIPrevamp3.csv",encoding = "ISO-8859-1")
Client = Client[["clnum","concat"]]
clientzip = Client['concat']

CSV示例

client  number  client add
40008               All, EdNULLNULLNULLNULLNULL
40009               EC, Inc. 4200 Exec-ParkwayS, MO  63141Attn: John Smith
40010               AWBWA, Inc. 2200 Northhighschool,VA  21801-7824Attn:              TerryLongNULL NULL

示例目的

邮政编码也将匹配国际邮政编码,4位和5位邮政编码,所有字段都没有邮政编码

然后,我想将结果重写回我的客户端数据框,作为匹配答案的第三列

2 个答案:

答案 0 :(得分:1)

ZIP始终是美国邮政编码吗?字段末尾有5位数字?

然后切掉它。

>>> 'smithjonllcRichmondVa23220'[-5:]
'23220'

如果您有4位数字,那么您可能需要正则表达式

>>> import re
>>> re.findall('\d{4,5}$', 'smithjonllcRichmondVa3220')[0]
'3220'

对于像21801-7824这样的“长邮政编码”,它变得更加复杂,当列本身包含逗号时,您会被传递给CSV文件(参见示例)

  

AWBWA, Inc. 2200 Northhighschool,VA

你只需要求一种不同的数据格式,因为好运解析它。

就pandas而言,您可以apply()对列进行操作。

答案 1 :(得分:0)

我将提供2个例子。

老实说,如果你的CSV一直按照你在例子中提到的格式进行格式化,你可以使用像这样的简单有限正则表达式找到zipcodes(它捕获字符串之前的所有非空格字符" Attn& #34;这似乎是你读取字符串中的主题):

>>> def zipcodes():
            import re
            csv = '''client  number  client add
            40008               All, EdNULLNULLNULLNULLNULL
            40009               EC, Inc. 4200 Exec-ParkwayS, MO  63141Attn: John Smith
            40010               AWBWA, Inc. 2200 Northhighschool,VA  21801-7824Attn:                  TerryLongNULL NULL'''
            zips = re.findall('([\S]+)Attn', csv)
            print(zips)

<强>输出:

>>> zipcodes()
['63141', '21801-7824']

...

...

现在,如果你想要更好的东西,通过忽略开始新行的数字来区分你可以使用这样的先行示例(注意:Python的前瞻文档不是最好的...... sheesh)。下面的预测是&#39;捕获5到6范围内的一串数字,如果适用的话,它们之间有0或1个数字,可能后跟任意数量的数字(在这种情况下为0或大于0)但只有在没有换行字符的情况下才会捕获这些数字&#39;

>>> def zipcodes():
            import re
            csv = '''client  number  client add
            40008               All, EdNULLNULLNULLNULLNULL
            40009               EC, Inc. 4200 Exec-ParkwayS, MO  63141Attn: John Smith
            40010               AWBWA, Inc. 2200 Northhighschool,VA  21801-7824Attn:              TerryLongNULL NULL'''
                zips = re.findall('(?<!\n)[\d]{5,6}[\-]?[\d]*', csv)
                print(zips)

<强>输出:

>>> zipcodes()
['63141', '21801-7824']

希望这有帮助。