使用 python Regex 从字符串中提取名称

MQa*_*ser 5 python regex

我一直在尝试从字符串中提取名称,但似乎还没有接近成功。

这是代码:

string = "555-1239Moe Szyslak(636) 555-0113Burns, C. Montgomery555 -6542Rev. Timothy Lovejoy555 8904Ned Flanders636-555-3226Simpson, Homer5553642Dr. Julius Hibbert"
regex = re.compile(r'([A-Z][a-z]+(?: [A-Z][a-z]\.)? [A-Z][a-z]+)')
print(regex.findall(string))
Run Code Online (Sandbox Code Playgroud)

这是我得到的输出:

['Moe Szyslak', 'Timothy Lovejoy', 'Ned Flanders', 'Julius Hibbert']
Run Code Online (Sandbox Code Playgroud)

DYZ*_*DYZ 10

即使是用英语提取人名也是出了名的困难。以下正则表达式可以解决您的特定问题,但在其他输入上可能会失败(例如,它不会捕获带破折号的名称):

re.findall(r"[A-Z][a-z]+,?\s+(?:[A-Z][a-z]*\.?\s*)?[A-Z][a-z]+", string)
#['Moe Szyslak', 'Burns, C. Montgomery', 'Timothy Lovejoy', 
# 'Ned Flanders', 'Simpson, Homer', 'Julius Hibbert']
Run Code Online (Sandbox Code Playgroud)

并附有标题:

TITLE = r"(?:[A-Z][a-z]*\.\s*)?"
NAME1 = r"[A-Z][a-z]+,?\s+"
MIDDLE_I = r"(?:[A-Z][a-z]*\.?\s*)?"
NAME2 = r"[A-Z][a-z]+"

re.findall(TITLE + NAME1 + MIDDLE_I + NAME2, string)
#['Moe Szyslak', 'Burns, C. Montgomery', 'Rev. Timothy Lovejoy', 
# 'Ned Flanders', 'Simpson, Homer', 'Dr. Julius Hibbert']
Run Code Online (Sandbox Code Playgroud)

顺便说一句,除非您打算重用它,否则不需要编译正则表达式。


gre*_*ory 6

花哨的正则表达式需要时间来编写并且难以维护。在这种情况下,我倾向于保持简单:

re.findall(r"[^()0-9-]+", string)

输出:

['Moe Szyslak', ' ', 'Burns, C. Montgomery', ' ', 'Rev. Timothy Lovejoy', ' ', 'Ned Flanders', 'Simpson, Homer', 'Dr. Julius Hibbert']

如果空白是一个问题,我会过滤 list(filter(str.strip,list))