Python邮政编码

Python邮政编码,python,regex,zipcode,Python,Regex,Zipcode,我对Python非常陌生,正在努力执行我需要的东西。 我需要从字符串concat中提取邮政编码。 我在研究regex,但我在功能上遇到了困难 import pandas as pd import re from pandas import ExcelWriter 我导入了CSV,编码文本类型的字符串上传问题,建立了带有数据框的列,并使concat拥有自己的df Client = pd.read_csv("CLZIPrevamp3.csv",encoding = "ISO-8859-1") Cl

我对Python非常陌生,正在努力执行我需要的东西。 我需要从字符串concat中提取邮政编码。 我在研究regex,但我在功能上遇到了困难

import pandas as pd
import re
from pandas import ExcelWriter
我导入了CSV,编码文本类型的字符串上传问题,建立了带有数据框的列,并使concat拥有自己的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位邮政编码,并且所有字段都没有邮政编码


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

邮政编码是否始终是美国邮政编码?字段末尾的5位数字

然后把它切掉

>>> 'smithjonllcRichmondVa23220'[-5:]
'23220'
如果您有4位数字,那么您可能需要正则表达式

>>> import re
>>> re.findall('\d{4,5}$', 'smithjonllcRichmondVa3220')[0]
'3220'
对于像21801-7824这样的长邮政编码,它会变得更复杂,当您收到一个CSV文件时,如果列本身包含逗号,则情况会更复杂参见示例

AWBWA公司,弗吉尼亚州北高中2200号

您只需要请求不同的数据格式,因为祝您好运


就pandas而言,可以在列上应用函数

我将提供两个示例

老实说,如果CSV的格式与您在示例中提到的一致,您可以使用简单但有限的正则表达式(如下所示)找到zipcodes,它捕获字符串Attn之前的所有非空格字符,该字符串Attn似乎是读取字符串中的主题:

>>> 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)
输出:

现在,如果您想要一些稍微好一点的东西,它通过忽略开始一行的数字来区分,您可以使用一个像这样的前瞻性示例注意:Python的前瞻性文档不是最好的。。。嘘。下面的展望说明的是“捕获范围为5到6的数字字符串,如果适用,它们之间有0或1个dahs,在这种情况下可能后跟任意数量的数字0或大于0,但只有在这些数字前面没有换行符时才捕获这些数字”

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

希望这能有所帮助。

如果没有这个电子表格/CSV,你能给出一个我们看不到的结果吗?我想问你一个CSV文件的示例,请原谅我不能给出任何数据,但是示例将是一个字段。姓-名-市-州-邮编-县。。。。所有这些数据连接在一个字段中,然后给出一个数据示例。弥补。否则,很难给你一个不是CSV的答案。如果zipcode总是最后5个字符,只需读取一行并使用line[-5:]提取最后5个字符。是的,非常糟糕,如果我抓取6列中的数据,但文本中仍然会有逗号,该怎么办。我直接查询出我们的数据库。没有一个字段真正具有相同的顺序,因此这是一个完整的问题。如果您有一个SQL数据库,pandas有一个read_SQL函数,您可以按照所需的列顺序直接查询它。如果字段顺序不正确,则向数据库的插入过程是错误的。数据库的插入过程没有统一的输入方式。弗吉尼亚,弗吉尼亚,弗吉尼亚,弗吉尼亚,弗吉尼亚,你关心的是邮政编码,而不是州。理想情况下,应该为state_name、state_abbrev、address、zip或其他替代项提供一个列元组。与数据库相符的是客户的代码,而不是检查输入验证的数据库。您完全正确,但不幸的是,摄入部门出错,数据库不要求他们在正确的列中输入所有内容。有时,所有内容都会进入地址列,而不是州、国家或邮政编码列。我们没有任何繁重的数据智能,我试图通过帮助他们编辑这些字段为他们解决一个问题
>>> 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']