Разделение имени человека на имя и фамилию - PullRequest
22 голосов
/ 03 ноября 2008

хорошо, поэтому в основном я задаю вопрос об их имени Я хочу, чтобы это был один ввод, а не имя и фамилия.

Теперь есть ли способ разделить это имя? и взять только последнее слово из «предложения», например

name = "Thomas Winter"
print name.split() 

и что бы выводить это просто "зима"

Ответы [ 15 ]

63 голосов
/ 03 ноября 2008

Вы обнаружите, что ваша ключевая проблема с этим подходом не техническая, а человеческая - разные люди пишут свои имена по-разному.

На самом деле терминология «имя» и «фамилия» сама по себе неверна.

В то время как многие смешанные семьи используют дефисные фамилии, такие как Смит-Джонс, есть такие, которые просто используют оба имени по отдельности, «Смит Джонс», где оба имени являются фамилией.

Многие европейские фамилии состоят из нескольких частей, например, "de Vere" и "van den Neiulaar". Иногда эти статисты имеют важную семейную историю - например, префикс, присужденный королем сотни лет назад.

Дополнительный вопрос: я правильно прописал их для людей, на которых ссылаюсь - «де» и «ван ден» не получают заглавных букв для одних семей, а для других.

И наоборот, многие азиатские культуры ставят фамилию на первое место, потому что семья считается более важной, чем личность.

Последний пункт - некоторые люди придают большое значение тому, чтобы быть «младшим», «старшим» или «III» - и ваш код не должен воспринимать их как фамилию.

Также отмечая, что есть немало людей, которые используют имя, которое не было присвоено их родителями, я с успехом использовал следующую схему:

ФИО (как обычно пишется для адресации почты); Фамилия; Известен как (имя, обычно используемое в разговоре).

например:

ФИО: Уильям Гейтс III; Фамилия: Гейтс; Известен как: Билл

Полное имя: Сун Ли; Фамилия: Сунг; Известен как: Лиза

14 голосов
/ 03 ноября 2008

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

Я бы порекомендовал вам попросить имена отдельно, если это вообще возможно.

10 голосов
/ 19 мая 2010

Это довольно старая проблема, но я нашел ее в поиске решения для разборки кусочков из сгруппированного имени.

http://code.google.com/p/python-nameparser/

6 голосов
/ 03 ноября 2008

Золотое правило данных - не агрегируйте слишком рано - гораздо проще склеить поля, чем разделить их. У большинства людей также есть отчество, которое должно быть необязательным полем. У некоторых людей есть множество отчеств. У некоторых людей есть только одно имя , одно слово. В некоторых культурах обычно есть словарь отчеств, в котором дань уважения генеалогическому древу обратно к посадке в Ковчег Голгафринчам.

Здесь вам не нужно кодовое решение - вам нужно бизнес-правило.

5 голосов
/ 03 ноября 2008

Простой способ сделать именно то, что вы просили в python, это

name = "Thomas Winter"
LastName = name.split()[1]

(обратите внимание на разделы в вызове функции split.)

split () создает список, в котором каждый элемент взят из вашей исходной строки, разделенных пробелами. Теперь вы можете получить второй элемент с помощью name.split () [1] или последний элемент с помощью name.split () [- 1]

Однако, как говорили другие, если вы НЕ уверены, что просто получаете строку типа «First_Name Last_Name», возникает гораздо больше проблем.

4 голосов
/ 16 февраля 2012

Вот как я делаю это в своем приложении:

def get_first_name(fullname):
    firstname = ''
    try:
        firstname = fullname.split()[0] 
    except Exception as e:
        print str(e)
    return firstname

def get_last_name(fullname):
    lastname = ''
    try:
        index=0
        for part in fullname.split():
            if index > 0:
                if index > 1:
                    lastname += ' ' 
                lastname +=  part
            index += 1
    except Exception as e:
            print str(e)
    return lastname

def get_last_word(string):
    return string.split()[-1]

print get_first_name('Jim Van Loon')
print get_last_name('Jim Van Loon')
print get_last_word('Jim Van Loon')
4 голосов
/ 01 ноября 2009

Если вы пытаетесь разобрать человеческое имя в PHP, я рекомендую сценарий Кита Бекмана nameparse.php .

3 голосов
/ 03 ноября 2008

Как это:

print name.split()[-1]
2 голосов
/ 04 ноября 2008

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

import re
p = re.compile(r'^(\s+)?(Mr(\.)?|Mrs(\.)?)?(?P<FIRST_NAME>.+)(\s+)(?P<LAST_NAME>.+)$', re.IGNORECASE)
m = p.match('Mr. Dingo Bat')
if(m != None):
  first_name = m.group('FIRST_NAME')
  last_name = m.group('LAST_NAME')
2 голосов
/ 03 ноября 2008

Разделить имена сложнее, чем кажется. У некоторых имен есть фамилии из двух слов; некоторые люди будут вводить имя, отчество и фамилию; некоторые имена имеют два рабочих имени. Более надежный (или наименее ненадежный) способ обработки имен состоит в том, чтобы всегда захватывать имя и фамилию в отдельных полях. Конечно, это порождает свои собственные проблемы, например, как обращаться с людьми только с одним именем, чтобы убедиться, что оно работает для пользователей, которые имеют другой порядок именных частей.

Имена жесткие, обращайтесь с ними осторожно.

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