0

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

我需要将名称分成几部分,将 city|state|zip 分成几部分。但是,名称可能有也可能没有中间名首字母,因此:

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

如果没有中间首字母,将无法使用。此外,城市名称可能有空格,也可能没有空格:

city, state, zipCode = m[4].split()

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

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

4

2 回答 2

3

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

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,并使用这些单词来定义名字和姓氏的开始和结束位置。但总的来说,您可能会遇到问题。

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

于 2010-01-19T21:27:44.190 回答
0

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

cityInfo = m[4].split()
city, state, zipCode = ' '.join(cityInfo[:-2]), cityInfo[-2], cityInfo[-1])
于 2010-01-19T21:29:09.210 回答