Python正则表达式findall匹配结果不符合预期的原因咨询
为什么你的正则返回
['o', 'p']而不是预期结果? 嘿,我来帮你理清楚这个问题!咱们一步步拆解来看看:
1. findall的核心特性是关键
当你的正则表达式里**包含捕获组(就是括号包裹的内容)**时,findall不会返回整个匹配的完整字符串,而是会返回每个匹配中捕获组实际捕获到的内容——这就是你结果不符合预期的核心原因。
2. 你的正则r'([m-z]){3}'到底在做什么?
这个正则的结构可以拆成两部分看:
([m-z]):定义了一个捕获组,专门捕获单个属于m-z范围的字符{3}:让前面的捕获组重复匹配3次
也就是说,它确实能匹配连续3个m-z的字符,但因为捕获组只针对单个字符,重复3次后,捕获组里只会保留最后一次重复的那个字符。
对着你的字符串拆解匹配过程
咱们拿'mnodabcnopqr'一步步看:
- 第一个匹配:
mno(三个连续的m-z字符),此时捕获组最后一次捕获的是第三个字符o - 跳过已匹配的
mno,后面的dabc都不属于m-z范围,直到遇到nop:这是第二个匹配,捕获组最后一次捕获的是第三个字符p - 剩下的
qr只有两个字符,不够3个的匹配要求,所以不会被匹配
所以findall最终返回的是两次捕获到的单个字符:['o', 'p']。
3. 如何得到预期的['mno', 'nop','pqr']?
你需要让正则捕获整个3字符的连续序列,而不是单个字符的重复,有两种简单的修改方式:
方法一:去掉捕获组,直接匹配3个连续字符
把正则改成这样,findall会默认返回所有完整匹配的字符串:
import re Regex1 = re.compile(r'[m-z]{3}') mo2 = Regex1.findall('mnodabcnopqr') print(mo2) # 输出 ['mno', 'nop', 'pqr']
方法二:给整个3字符序列加捕获组
如果你后续需要用到捕获组(比如引用匹配内容),可以把整个3字符范围包裹在括号里,让捕获组对应完整的3字符序列:
import re Regex1 = re.compile(r'([m-z]{3})') mo2 = Regex1.findall('mnodabcnopqr') print(mo2) # 输出 ['mno', 'nop', 'pqr']
这样修改后,就能得到你预期的结果啦~
内容的提问来源于stack exchange,提问作者Webair
相关产品推荐
相关产品推荐

