【问题标题】:Parsing name and address information with differing number of spaces使用不同数量的空格解析名称和地址信息
【发布时间】:2010-01-19 21:23:11
【问题描述】:

我有一个逗号分隔的文本文件。每行的第 5 个字段包含姓名和地址信息。名称与街道信息之间用“¬”字符分隔。相同的字符也分隔 city|state|zip。示例字段为:
"¬BOL¬MICKEY M MOUSE¬123 TOMORROW LANE¬ORLANDO FL 12345-6789¬¬¬EOL¬"

我需要将名称分成几部分,将城市|州|zip 分成几部分。但是,名称可能有也可能没有中间名首字母,所以:

m = l[4].split("¬")
firstName, mi, lastName = m[2].split()

如果没有中间名首字母将不起作用。此外,城市名称可能有也可能没有空格,所以:

城市,州,邮政编码 = m[4].split()

例如,如果城市是“圣安东尼奥”或“里约热内卢”,则无法使用。

底线,我如何解析一个字段的部分,其中部分的格式并不总是相同?

【问题讨论】:

  • 在空白处分割并测试结果有多少子字符串

标签: python parsing street-address


【解决方案1】:

在您的示例中,您似乎可以在这两种情况下通过获取“第一个字段”、“最后一个字段”和“中间的所有内容”来解决问题:

m = line.split("¬")[2].split()
firstname = m[0]
surname = m[-1]
initials = m[1:-1] # Maybe just keep this as a list?

还有:

m = line.split("¬")[4].split()
city = ' '.join(m[:-2])
state = m[-2]
zipCode = m[-1]

通常,您可以通过从开头和结尾获取“固定”字段来处理包含空格的单个字段,剩下的就是可以包含空格的字段。只要您有两个包含空格的字段在同一列中,您无能为力。它的定义模棱两可。

对于您拥有的数据格式,如果有些人的名字或姓氏包含空格,例如 Robert Van de Graff,您可能会遇到一些问题。如果您有首字母,则可以通过查找仅包含一个字母的单词来解决此问题,例如:Robert J. Van de Graaff,并使用这些单词来定义名字和姓氏的开始和结束位置。但总的来说,您可能会遇到问题。

这里还隐藏着一个国际化问题:不是每个人都先写他们的“名字”——有时他们会先写他们的姓氏。

【讨论】:

  • 我在“split split”行收到一个 AttributeError:AttributeError: 'list' object has no attribute 'split'。我在 Windows XP 下使用 ActiveState 的 ActivePython 2.6。
  • 你是对的。在测试您的建议时,一些姓氏有空格(即 Ronald H Mc Donald)。我将把中间首字母是列表 ['H', 'Mc'] 的情况写到一个错误文件中,以不同方式处理。
  • @CountBoxer:在这种情况下,Mc 几乎可以肯定是姓氏的一部分。好像有人输入不正确。这在真实数据中经常发生。不过,两个中间名首字母并没有错——例如,我有两个中间名。您可以搜索包含一个字母的所有单词并说这些是首字母,之前的任何内容都是名字,之后的任何内容都是姓氏。如果缺少名字或姓氏,这是一个错误。如果没有首字母,您只需做出最佳猜测。
【解决方案2】:

基本上按照 Anon 的建议,您可以这样实现:

cityInfo = m[4].split()
city, state, zipCode = ' '.join(cityInfo[:-2]), cityInfo[-2], cityInfo[-1])

【讨论】:

  • 如果我拆分空格并测试数组的长度: name = m[2].split() if len(name) == 2: firstName, lastName = m[2].split () mi = "" elif len(name) == 3: firstName, mi, lastName = m[2].split() else: print "Error in name: %s" % (m[2]) firstName, mi , lastName = "", "", "" 但这对于 city|state|zip 数据......和丑陋的代码是不切实际的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-05
  • 2011-10-15
  • 1970-01-01
  • 2014-09-20
相关资源
最近更新 更多