解析带有不同空格数量的姓名和地址信息
我有一个用逗号分隔的文本文件。每一行的第5个字段包含了姓名和地址信息。姓名和街道信息之间用一个'¬'符号分隔。这个符号同样用来分隔城市、州和邮政编码。一个示例字段是:
"¬BOL¬MICKEY M MOUSE¬123 TOMORROW LANE¬ORLANDO FL 12345-6789¬¬¬¬EOL¬"
我需要把姓名和城市|州|邮政编码分开。不过,姓名可能有中间名的缩写,也可能没有,所以:
m = l[4].split("¬")
firstName, mi, lastName = m[2].split()
如果没有中间名,这样就不行了。而且城市的名字可能有空格,比如:
city, state, zipCode = m[4].split()
如果城市是'San Antonio'或者'Rio de Janeiro',这样也不行。
总之,我该怎么处理这些字段的不同格式呢?
2 个回答
基本上,Anon建议的内容,你可以这样实现:
cityInfo = m[4].split()
city, state, zipCode = ' '.join(cityInfo[:-2]), cityInfo[-2], cityInfo[-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”,这样就能确定名字和姓氏的开始和结束。不过总的来说,你可能还是会遇到麻烦。
另外,这里还有一个国际化的问题:并不是每个人都习惯把“名字”放在前面,有时候他们会先写姓氏。