Печать имени в формате имени и фамилии

У меня есть текстовый файл, который содержит данные как:

Last name, First name in some of the cases

Например:

The patient was referred by Dr. Douglas, John, updated by: ‎Acosta, Christina
The patient was referred by Potter, Rob,M.D.
Sam was referred by Dr. Alisa Russo

Я хочу вывести как:

John Douglas
Rob Potter
Alisa Russo

Я использую код как:

print(str(string.partition(',')[2].split()[0] +" "+string.partition(',')[0].split()[0]))

person Slickmind    schedule 02.08.2018    source источник
comment
Я не думаю, что вы можете ожидать, что регулярное выражение сможет предоставить вам то, что вы хотите, учитывая крайнюю изменчивость строки.   -  person addohm    schedule 02.08.2018
comment
Почему бы не напечатать Acosta, Cgristina   -  person Onyambu    schedule 02.08.2018
comment
Нам нужны только врачи, которые направили   -  person Slickmind    schedule 02.08.2018


Ответы (3)


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

import re
data = '''The patient was referred by Dr. Douglas, John, updated by: ‎Acosta, Christina
The patient was referred by Potter, Rob,M.D.
Sam was referred by Dr. Alisa Russo'''
for name in re.findall(r"(?<=Dr. ){0}|{0}(?=,\s*M.D.)".format("[a-z'-]+,? [a-z'-]+"), data, re.IGNORECASE):
    print(' '.join(name.split(', ')[::-1]) if ', ' in name else name)

Это выводит:

John Douglas
Rob Potter
Alisa Russo
person blhsing    schedule 02.08.2018
comment
это решение хорошее, но ошибается, когда у доктора есть отчество - person Slickmind; 02.08.2018
comment
В образце ввода вашего вопроса нет отчества. С возможным отчеством невозможно отличить имя из трех слов от имени из двух слов с другим обычным словом. Например, как узнать, относится ли Hello John Doe, MD к кому-то по имени Hello John Doe или просто к обычному слову Hello, за которым следует некто по имени John Doe? Вы должны сначала определить четкую логику, прежде чем можно будет реализовать. - person blhsing; 02.08.2018
comment
Да, я понял твою мысль. Ваше решение очень полезно, поэтому я использую вашу логику и пространство, чтобы сделать это. - person Slickmind; 02.08.2018
comment
Могу ли я узнать, как я могу преобразовать Акосту, доктора медицины, Кристину, врача-кардиолога, в Кристину Акосту, доктора медицины, врача-кардиолога? - person Slickmind; 02.08.2018
comment
Теперь я вижу, что ваш новый вопрос касается замены, а не просто поиска имен. Я собираюсь ответить на это в вашем новом вопросе. stackoverflow .com/questions/51644998/ - person blhsing; 02.08.2018
comment
Да, потому что использование только Python было бы мало специфичным. Данные могут измениться в будущем в каком-то новом формате, поэтому я пытаюсь использовать NLTK или SPACY, чтобы код стал общим и мог извлекать имена независимо от того, в каком формате он находится. - person Slickmind; 02.08.2018

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

(?:Dr. )(\w+) (\w+)|(?:Dr. )(\w+), (\w+)|(\w+), (\w+),?(?: ?M\.?D\.?)

Демо

Пример кода:

import re

regex = r"(?:Dr. )(\w+) (\w+)|(?:Dr. )(\w+), (\w+)|(\w+), (\w+),?(?: ?M\.?D\.?)"

test_str = ("The patient was referred by Dr. Douglas, John, updated by: ‎Acosta, Christina\n"
    "The patient was referred by Potter, Rob,M.D.\n"
    "Sam was referred by Dr. Alisa Russo")

matches = re.finditer(regex, test_str, re.MULTILINE)
results = []

for match in matches:
    if match.group(1):
        results.append([match.group(1), match.group(2)])
        next
    if match.group(3):
        results.append([match.group(4), match.group(3)])            
        next
    if match.group(5):
        results.append([match.group(6), match.group(5)])
        next

Результатом является список списков. Тогда печать становится очень простой.

[['John', 'Douglas'], ['Rob', 'Potter'], ['Alisa', 'Russo']]
person wp78de    schedule 02.08.2018
comment
это решение хорошее, но ошибается, когда у доктора есть отчество - person Slickmind; 02.08.2018
comment
@Slickmind Да, как я уже сказал, фиксировать имена сложно, к тому же вы раньше не упоминали отчества. Вот шаблон, который соответствует необязательным инициалам второго порядка. Если это все еще не соответствует вашим потребностям, обновите свой вопрос или опубликуйте новый. - person wp78de; 02.08.2018

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

person trilogy    schedule 02.08.2018