【问题标题】:Printing name as first name and last name format将姓名打印为名字和姓氏格式
【发布时间】:2018-08-02 01:00:05
【问题描述】:

我有一个包含以下数据的文本文件:

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]))

【问题讨论】:

  • 鉴于字符串的极端可变性,我认为您无法期望正则表达式能够为您提供所需的内容。
  • 为什么不打印 Acosta, Cgristina
  • 我们只需要推荐的医生

标签: regex python-3.x spacy data-extraction


【解决方案1】:

你可以先找到名字,前面有“博士”。或后跟“M.D.”,然后输出名称时,如果有逗号,则交换名称顺序:

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

【讨论】:

  • 这个解决方案很好,但是当医生有中间名时会出错
  • 您的问题的示例输入中没有中间名。有了可能的中间名,就无法将 3 词名称与 2 词名称与另一个常规词区分开来。例如,你怎么知道“Hello John Doe, M.D.”指的是一个叫“Hello John Doe”的人,或者只是一个普通的词“Hello”,后面跟着一个叫“John Doe”的人?您必须先定义清晰的逻辑,然后才能实现。
  • 是的,我明白你的意思。您的解决方案非常有帮助,所以我正在使用您的逻辑和空间来这样做
  • 请问我如何将 Acosta, Christina, M.D. 转换为 Christina Acosta, M.D. 是一名心脏医生
  • 我现在看到您的新问题是关于替换而不是简单地查找名称。我将在你的新问题中回答这个问题。 stackoverflow.com/questions/51644998/…
【解决方案2】:

第一个挑战是获取医生的名字和姓氏。这很难,因为有些名字是毛茸茸的。带有一些交替的正则表达式可以提供帮助,例如

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

Demo

Code Sample:

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']]

【讨论】:

  • 这个解决方案很好,但是当医生有中间名时会出错
  • @Slickmind 是的,正如我所说,捕获名字很难,而且你之前没有提到中间名。这是一个匹配optional middle initial 的模式。如果这仍然不能满足您的需求,请更新您的问题或发布一个新问题。
【解决方案3】:

老实说,我会先抓住名字。使用正则表达式......一旦你明白了,然后根据','切换名字/姓氏。不要一次完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多