python - 如何使用正则表达式提取人名?
问题描述
我是正则表达式的新手,我有一个电话目录。我想从中提取名称。我写了这个(如下),但它提取了许多不需要的文本而不仅仅是名称。你能告诉我我做错了什么以及如何纠正吗?这是我的代码:
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')
推荐阅读
- android - 运行 UI AUTOMATOR 时出错,使用 java 1.8
- swift - 为什么这个组合订阅不会在自定义 ViewModifier 中解除分配?
- php - 数据库模式树形视图 PHP MYSQL
- sql - 不重复相同的数据
- arrays - 如何将嵌套字典插入到 Swift 中的字典中
- c# - 我正在尝试转换一些 C# 代码,以便它可以处理 64 位地址
- reactjs - 使用 React Router 访问特定 URL
- amazon-web-services - scp 从本地计算机到 EC2 实例(使用 WSL) - 权限被拒绝(公钥)
- kotlin - Kotlin 按索引列表过滤字符串
- c# - 将 JSON 返回到客户端时,“从客户端检测到潜在危险的 Request.Form 值”