Разделение имени человека на имя и фамилию

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

Есть ли способ разделить это имя? и взяв только последнее слово из "Приговора", например

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

и что бы на выходе было просто "Зима"


person Community    schedule 03.11.2008    source источник
comment
Вот обязательная статья, которую должен знать каждый программист: kalzumeus .com / 2010/06/17 /   -  person tripleee    schedule 19.09.2018
comment
См. Также stackoverflow.com/questions/1122328/   -  person Raedwald    schedule 01.10.2019


Ответы (16)


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

Фактически, терминология «имя» и «фамилия» сама по себе ошибочна.

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

Многие европейские фамилии состоят из нескольких частей, таких как «де Вер» и «ван ден Нейулаар». Иногда у этих статистов есть важная семейная история - например, префикс, присвоенный королем сотни лет назад.

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

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

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

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

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

e.g:

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

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

person Bevan    schedule 03.11.2008
comment
+1. Для приложений у меня обычно есть поля полного имени и псевдонима, которые заполняются независимо. У меня не было варианта использования фамилии, но YMMV. - person erickson; 03.11.2008
comment
+1 - ПОЖАЛУЙСТА, не забывайте, что те из нас, кого родители благословили, использовать имя, отличное от нашего имени - например, J. Эдгар Гувер ». Юридическое название (и CC, в большинстве случаев) требует 'J. Эдгар Гувер »; Случайный / Псевдоним / Известный - как бы «Эдгар Гувер». Имя, МИ, Фамилия не годятся. - person Ken Gentle; 04.11.2008
comment
А у некоторых людей нет фамилии или фамилии, например в некоторых восточноафриканских культурах они используют имя отца и имя деда, например Том Дик Гарри. В некоторых случаях фамилия находится посередине, например. Энсон Мария Элизабет Чан Фонг Онсанг. См. Также статьи Википедии Исландское имя, арабское имя и Имена в Российской Империи, Советском Союзе и странах СНГ. - person John Machin; 01.11.2009
comment
Отличное написание. Спасибо. Я думаю, что сообщение @xeolot о python-nameparser отлично подходит для всего, что вы упомянули. - person dlink; 16.02.2018

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

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

person Dave DuPlantis    schedule 03.11.2008
comment
Согласны, а как насчет, скажем, Майка Сент-Джеймса, например? Будет возвращена неправильная фамилия. - person Fry; 03.11.2008
comment
Анн Мари ван Гвидо. Где заканчивается имя и начинается фамилия ?! Человечество! - person Tom Ritter; 03.11.2008
comment
Не говоря уже о культурах, где фамилия дается первой. Спрашивать имя сразу - это нормально, только если вы всегда относитесь к нему как к единой единице. Попытка разделить его обычно приводит к искажению некоторых случаев. - person Brian; 03.11.2008
comment
Некоторые имена также имеют апостроф или другие специальные символы, которые вызывают проблемы при неправильной обработке. Многие ирландские имена, например О'Коннор, попади в эту категорию. - person Ryan; 03.11.2008
comment
Как человек, у которого несколько фамилий, я получаю удовольствие от этих ответов ... ;-) - person cethegeek; 01.11.2009
comment
@Ryan: или у них нет апострофа, например Gearóid Ó Súilleabháin ... для которого у вас может быть дублирующаяся запись в базе данных, поданная под Джерардом О'Салливаном :-) - person John Machin; 01.11.2009

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

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

person Xealot    schedule 19.05.2010
comment
Он очень ориентирован на США (например, названия, кажется, охватывают практически все звания в вооруженных силах США), а код использования заглавных букв порождает обычные глупости, такие как MacE, MacK и MacHin :-( - person John Machin; 19.05.2010
comment
Я думаю, что это отличная библиотека Python, которая полностью решает все проблемы, перечисленные @bevan в его сообщении. Согласен с комментариями JohnMachin о том, что он ориентирован на США, однако это нормально для моего варианта использования. Я начал писать более простую версию python-nameparser, прежде чем прочитал ваш пост. Спасибо. - person dlink; 16.02.2018

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

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

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

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

Однако, как говорили другие, если вы не УВЕРЕНЫ, что получаете строку типа «Имя Фамилия», возникает гораздо больше проблем.

person Baltimark    schedule 03.11.2008
comment
Если вы ищете только FirstName, это: FirstName = name.split () [0] - Но это то, что я искал (за исключением отчества :)). Спасибо! - person hiquetj; 23.03.2018

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

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

person CAD bloke    schedule 03.11.2008

Нравится:

print name.split()[-1]
person JesperE    schedule 03.11.2008
comment
print name.split () [- 1] обратите внимание на () - person Jake; 04.11.2008
comment
Прости. Я немного поврежден Рубином. - person JesperE; 04.11.2008

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

person Jonathon Hill    schedule 01.11.2009
comment
И даже если вы не используете PHP, просмотр кода очень поучителен. - person divegeek; 01.11.2009

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

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')
person Ryan Flores    schedule 16.02.2012
comment
Привет. Спасибо за код. Наблюдение: вы можете избавиться от необходимости устанавливать индекс с помощью enumerate - для индекса, части в enumerate (fullname.split ()). Также вы можете избавиться от необходимости использовать условное выражение вокруг + = '', используя соединение. lastname = '' .join (фамилии) - person dlink; 15.02.2018
comment
return " ".join(fullname.split()[1:]) вместо всего в try...except. - person Vedran Šego; 26.02.2018

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

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')
person UberJumper    schedule 04.11.2008
comment
Этот код самый короткий и удобный для случайного использования. Я использую его с Firebase, потому что API Firebase дает мне только полное имя. Одна проблема в том, что он не обрабатывает LAST, FIRST. С этим легко справиться, проверив запятую перед применением. Если есть запятая, просто переверните регулярное выражение. - person John Pang; 03.09.2018

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

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

person acrosman    schedule 03.11.2008

Это определенно более сложная задача, чем кажется на первый взгляд. Я написал некоторые задачи, а также свой алгоритм их решения в своем блоге. Обязательно ознакомьтесь с моим проектом Google Code, если вам нужна последняя версия на PHP:

http://www.onlineaspect.com/2009/08/17/splitting-names/

person Josh Fraser    schedule 10.09.2010

Вот как это сделать в SQL. Но нормализация данных с помощью такого рода вещей действительно медвежья. Я согласен с Дэйвом ДюПлантисом в отношении запроса отдельных материалов.

person JosephStyons    schedule 03.11.2008

Я бы указал стандартный формат (они используются в некоторых формах), например «Пожалуйста, напишите свое имя в форме Имя, Фамилия».

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

person Bogdan    schedule 03.11.2008

Вы можете использовать str.find() для этого.

x=input("enter your name ")
l=x.find(" ")
print("your first name is",x[:l])
print("your last name is",x[l:])
person Gaurav Meena    schedule 10.12.2019
comment
Из обзора: добавьте описание к своему ответу, а также правильно отформатируйте его. См. ОТВЕТ - person sɐunıɔןɐqɐp; 10.12.2019

Вы, вероятно, захотите использовать для этого rsplit:

rsplit([sep [,maxsplit]])

Вернуть список слов в строке, используя sep в качестве строки-разделителя. Если задано maxsplit, выполняется не более maxsplit разбиений, самые правые. Если sep не указан или None, любая строка с пробелами является разделителем. За исключением разделения справа, rsplit() ведет себя как split(), что подробно описано ниже. Новое в версии 2.4.

person Adam Alexander    schedule 03.11.2008

person    schedule
comment
Здесь есть некоторые проблемы. Вы используете join() со строкой в ​​качестве аргумента, поэтому в этом примере вы должны напечатать W i n t e r. Другая проблема заключается в том, что код не работает, если у вас есть 3 или более слов в переменной name. Я думаю, вы забыли добавить * в свой распакованный файл, например: first, *last = name.split(), чтобы исправить все проблемы. - person Danilo Akamine; 01.07.2020