如何用Python re.findall匹配Johnson、Jackson,排除Jason?
解决Python正则匹配Jackson/Johnson排除Jason的问题
你的正则表达式"J*\w{2}*son"存在几个问题:
J*会匹配0个或多个J,完全不符合我们只匹配单个J开头字符串的需求\w{2}*是无效语法,{2}已经指定固定2个字符,后面加*没有任何意义- 这个正则会错误匹配Jason,因为Jason的J后
as是两个字符,加上son正好符合\w{2}son的结构
要精准匹配Jackson和Johnson,同时排除Jason,可以用以下两种方案:
方案1:直接指定匹配目标分支
最简单的方式是直接写出两个目标字符串的分支:
import re a = "Jackson, Johnson, Jason" matches = re.findall(r"Jackson|Johnson", a) print(matches) # 输出: ['Jackson', 'Johnson']
方案2:用非捕获组简化正则
如果目标字符串有重复部分,可以用非捕获组提取公共部分,让正则更简洁:
import re a = "Jackson, Johnson, Jason" matches = re.findall(r"J(?:ack|ohn)son", a) print(matches) # 输出: ['Jackson', 'Johnson']
这里(?:ack|ohn)是非捕获组,作用是匹配ack或者ohn,但不会把这部分单独作为捕获结果返回,所以findall会直接返回完整的匹配字符串。
这两种方案都能精准匹配Jackson和Johnson,同时完全排除Jason——因为Jason的结构是J+aso+son,不符合我们指定的分支规则。
内容的提问来源于stack exchange,提问作者JD13
相关产品推荐
相关产品推荐

