正则表达式无法过滤小写开头姓名,求匹配Nakamoto姓氏的正确写法
我来帮你搞定这个正则匹配的问题!看了你的代码和需求,发现有两个关键问题导致结果不符合预期,咱们一步步解决:
问题1:正则表达式逻辑搞反了
你写的[^A-Z]{1}是匹配任意非大写字母的字符,这反而会让小写开头的名字(比如satoshi Nakamoto)通过匹配,完全和你想要的「名字首字母大写」的要求背道而驰。另外,你没有限制字符串的开头和结尾,导致纯Nakamoto这种无名字的情况也可能被误匹配。
问题2:遍历列表的方式错误
你把整个nameList转成字符串再用findall,这会让正则去匹配列表的引号、逗号等无关符号,正确的做法应该是逐个遍历列表里的每个姓名字符串。
修正后的完整代码
下面是调整后的代码,完全符合你的预期需求:
#! python3 # nameRex.py # 用于查找姓氏为Nakamoto的姓名的正则表达式 import pprint, re matches = [] nameList = ['Saoshi Nakamoto', 'Alice Nakamoto', 'RoboCop Nakamoto', 'satoshi Nakamoto', 'Mr. Nakamoto', 'Nakamoto', 'Satoshi nakamoto', 'Y2D Nakamoto'] # 重新编写正则,精准匹配要求的姓名格式 nakamotoOrNot = re.compile(r''' ^ # 锁定字符串开头,确保是姓名的起始 ([A-Z] # 名字首字母必须是大写 [a-zA-Z]*) # 名字后续可以是任意大小写字母(支持RoboCop这种驼峰式名字) \s # 名字和姓氏之间必须有空格 (Nakamoto) # 固定姓氏,必须是大写开头的Nakamoto $ # 锁定字符串结尾,确保没有多余内容,排除纯Nakamoto的情况 ''', re.VERBOSE) # 逐个遍历每个姓名,匹配成功就加入结果列表 for name in nameList: match_result = nakamotoOrNot.match(name) if match_result: # 按你预期的格式组装元组 matches.append( (match_result.group(1), ' ', match_result.group(2)) ) pprint.pprint(matches)
运行结果
执行后会输出你想要的预期结果:
[('Saoshi', ' ', 'Nakamoto'), ('Alice', ' ', 'Nakamoto'), ('RoboCop', ' ', 'Nakamoto')]
为什么能过滤掉不符合的情况?
satoshi Nakamoto:名字首字母是小写,不满足[A-Z]的要求,被排除Mr. Nakamoto:名字包含.符号,正则只允许字母,被排除Nakamoto:没有前面的名字+空格,不匹配^([A-Z][a-zA-Z]*)\s,被排除Satoshi nakamoto:姓氏是小写的nakamoto,不匹配固定的Nakamoto,被排除Y2D Nakamoto:名字包含数字,正则只允许字母,被排除
内容的提问来源于stack exchange,提问作者Tim Dai
相关产品推荐
相关产品推荐

