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

7

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

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

I18n:您是否考虑过姓在前名在后的系统? - Boldewyn
1
无论实现语言如何,根本问题并不像看起来那么容易解决 - 请参阅此重复问题:https://dev59.com/qHVD5IYBdhLWcg3wDXJ3 - Daniel Earwicker
不,我不认为这符合我的要求。不过,对于更复杂的名称解析器来说,这是一个有趣的观点。 - y2k
最复杂的名称可以在我的A.J. Hardie Jr.和D.J. Richies III的例子中看到。 - y2k
4个回答

8

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

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}

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

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}

有趣的正则表达式用法。这可能会处理并适应比Anurag的更多的情况。感谢您提供的解决方案。 - y2k

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接