我如何分析人';Python中的名字和姓氏是什么?

我如何分析人';Python中的名字和姓氏是什么?,python,parsing,Python,Parsing,因此,基本上我需要解析一个名称并找到以下信息: 名字 首字母缩写(如果员工有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.等名字的首字母缩写,则使用两个首字母)

  • 姓氏(如果员工有后缀,如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.' }
预期输出:

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.?

对于简单的示例名称,您可以这样做

# 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}

我还没有测试过它,但是像这样的函数应该可以在您提供的输入示例中完成这项工作。

没有通用的解决方案,解决方案将取决于您设置的约束。对于您在这里给出的规格,有一个简单的解决方案,它给出了您想要的

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

这与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}

我发现这个库对于解析名称非常有用


它也可以处理格式化的姓氏、姓氏、./p>i18n:你考虑系统,其中姓氏最先出现,而给定的名字是第二个?潜在的问题(不管实现语言)不是显而易见的可解的——见这个副本:NAH,我认为这不符合我的要求。对于更复杂的名称解析器来说,这是一个有趣的观点。最复杂的名称将显示在我的a.J.Hardie Jr.和D.J.Richies III示例中。正则表达式的有趣用法。这可能会处理和适应tan Anurag的更多情况。谢谢你的解决方案。