如何在Python中解析人名的姓和名?

7 投票
4 回答
22403 浏览
提问于 2025-04-15 15:55

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

  • 名字

  • 名字的首字母(如果员工的名字有缩写,比如 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.?

4 个回答

4

没有一个通用的解决办法,具体的解决方案会根据你设定的条件而不同。根据你提供的要求,这里有一个简单的解决方案,可以完全满足你的需求。

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.'}
8

我发现这个库在解析名字方面非常有用。你可以在这里找到它:https://github.com/derek73/python-nameparser

它还可以处理那种格式为“姓, 名”的名字。

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}

我没有测试过,但这样的一个函数应该能处理你提供的输入示例。

撰写回答