Разбор имени и фамилии людей в Python - PullRequest
7 голосов
/ 12 ноября 2009

Большое спасибо всем, кто помог!

Итак, мне нужно разобрать имя и найти следующую информацию:

Имя

First Initial (если у сотрудника есть инициалы для имени, например D.J., используйте оба инициала)

Фамилия (включая, если у сотрудника есть суффикс, такой как младший или 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.' }

Не очень хорошо в Regex, и на самом деле это, вероятно, излишне для этого. Я просто догадываюсь:

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

Да, я не знаю, давно не работал с Python.

Любая помощь будет принята с благодарностью! Спасибо:)

Большое спасибо всем, кто помог, ты спас мне жизнь!

Ответы [ 4 ]

7 голосов
/ 04 февраля 2013

Я нашел эту библиотеку весьма полезной для анализа имен. https://code.google.com/p/python-nameparser/

Он также может работать с именами в формате Фамилия, Имя.

3 голосов
/ 12 ноября 2009

Не существует общего решения, и решение будет зависеть от установленных вами ограничений. Для спецификации, которую вы дали здесь, это простое решение, которое дает именно то, что вы хотите

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 голосов
/ 12 ноября 2009

Это в основном то же решение, что и предоставленное 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}
3 голосов
/ 12 ноября 2009

Ну, для ваших простых имен примеров, вы можете сделать что-то вроде этого.

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

Я не проверял это, но функция, подобная этой, должна выполнять работу на приведенном вами примере ввода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...