在Python中解析人的名字和姓氏

时间:2009-11-12 07:23:59

标签: python parsing

非常感谢所有帮助过的人!

所以基本上我需要解析一个名字并找到以下信息:

名字

First Initial(如果员工有名字的首字母,如D.J.,请使用两个首字母)

姓氏(如果员工有后缀,例如Jr.或III,则包含。)


所以这是我正在使用的界面:

输入:

names = ["D.J. Richies III", "John Doe", "A.J. Hardie Jr."]
for name in names:
   print parse_name(name)

预期输出:

{'FirstName': 'D.J.', 'FirstInitial': 'D.J.', 'LastName': 'Richies III' }
{'FirstName': 'John', 'FirstInitial': 'J.', 'LastName': 'Doe' }
{'FirstName': 'A.J.', 'FirstInitial': 'A.J.', 'LastName': 'Hardie Jr.' }

不是很擅长正则表达式,实际上这可能有点过头了。我只是在猜测:

if name[1] == ".":  # we have a name like D.J.?

呃,我不知道,很久没有使用Python了。

任何帮助都会非常感激!谢谢:))

非常感谢所有帮助过的人,你救了我的命!

4 个答案:

答案 0 :(得分:7)

我发现这个库对于解析名称非常有用。 https://code.google.com/p/python-nameparser/

它还可以处理格式为Lastname,Firstname的名称。

答案 1 :(得分:3)

嗯,对于您的简单示例名称,您可以执行类似的操作。

# This separates the first and last names
name = name.partition(" ")
firstName = name[0]
# now figure out the first initial
# we're assuming that if it has a dot it's an initialized name,
# but this may not hold in general
if "." in firstName:
    firstInitial = firstName
else:
    firstInitial = firstName[0] + "."
lastName = name[2]
return {"FirstName":firstName, "FirstInitial":firstInitial, "LastName": lastName}

我还没有对它进行测试,但是这样的函数应该在你提供的输入示例上完成。

答案 2 :(得分:3)

没有通用解决方案,解决方案将取决于您提出的限制。你在这里给出的规格是一个简单的解决方案,它可以提供你想要的东西

def parse_name(name):
   fl = name.split()
   first_name = fl[0]
   last_name = ' '.join(fl[1:])
   if "." in first_name:
      first_initial = first_name
   else:
      first_initial = first_name[0]+"."

   return {'FirstName':first_name, 'FirstInitial':first_initial, 'LastName':last_name}

names = ["D.J. Richies III", "John Doe", "A.J. Hardie Jr."]
for name in names:
   print parse_name(name)

输出:

{'LastName': 'Richies III', 'FirstInitial': 'D.J.', 'FirstName': 'D.J.'}
{'LastName': 'Doe', 'FirstInitial': 'J.', 'FirstName': 'John'}
{'LastName': 'Hardie Jr.', 'FirstInitial': 'A.J.', 'FirstName': 'A.J.'}

答案 3 :(得分:3)

这与Anurag Uniyal提供的解决方案基本相同,只是更紧凑:

import re

def parse_name(name):
    first_name, last_name = name.split(' ', 1)
    first_initial = re.search("^[A-Z.]+", first_name).group()
    if not first_initial.endswith("."):
        first_initial += "."
    return {"FirstName": first_name,
            "FirstInitial": first_initial,
            "LastName": last_name}