python - 如何使用正则表达式提取人名?

标签 python regex

我是正则表达式的新手,我有一个电话簿。我想从中提取名称。我写了这个(下面),但它提取了很多不需要的文本而不仅仅是名字。你能告诉我我做错了什么以及如何纠正吗?这是我的代码:

import re

directory = '''Mark Adamson
Home: 843-798-6698
(424) 345-7659
265-1864 ext. 4467
326-665-8657x2986
E-mail:madamson@sncn.net
Allison Andrews
Home: 612-321-0047
E-mail: AEA@anet.com
Cellular: 612-393-0029
Dustin Andrews'''


nameRegex = re.compile('''
(
[A-Za-z]{2,25}
\s
([A-Za-z]{2,25})+
)

''',re.VERBOSE)

print(nameRegex.findall(directory)) 

它给出的输出是:

[('Mark Adamson', 'Adamson'), ('net\nAllison', 'Allison'), ('Andrews\nHome', 'Home'), ('com\nCellular', 'Cellular'), ('Dustin Andrews', 'Andrews')]

非常感谢您的帮助!

最佳答案

你的问题是 \s 也会匹配换行符。而不是 \s 只需添加一个空格。也就是

name_regex = re.compile('[A-Za-z]{2,25} [A-Za-z]{2,25}')

如果名称恰好有两个词,则此方法有效。如果名字有两个以上的单词(中间名或带连字符的姓氏),那么您可能希望将其扩展为类似以下内容:

name_regex = re.compile(r"^([A-Za-z \-]{2,25})+$", re.MULTILINE)

这会查找一个或多个单词,并将从一行的开头延伸到结尾(例如,不会只从“John Paul Jones”中获取“John Paul”)

关于python - 如何使用正则表达式提取人名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57539531/

相关文章:

python - 如何使最后一个 gtk.TreeView 列可调整大小?

python - 从 BeautifulSoup Parsing 获取特定值

regex - 如何将 www 放在 htaccess 中的 wordpress 站点 url 前面?

regex - 使用向量和两列数据框的 R 正则表达式

python - 如何使用 nltk 去除 ptb 解析树中的 -NONE- 和 *T*-i?

java - 功能点估计

python - 如何让一个圆每秒改变颜色?

java - 字符串上的正则表达式

regex - 如何识别正则表达式的 "tokens"(错误单词)

javascript - Javascript 正则表达式中的 g 和 m 修饰符有什么区别?