Python中re.findall方法行为异常:匹配结果不符预期求助
为什么findall返回['ytho']而不是['Python']?
这事儿核心是re.findall()的一个关键行为规则——当正则表达式里包含捕获组(就是用()括起来的部分)时,findall默认只会返回捕获组匹配到的内容,而不是整个正则匹配到的完整字符串。
看你的正则r'P(.*?)n':
P和n是正则里的固定匹配边界,中间的(.*?)是一个捕获组,它负责匹配P和n之间的任意字符(非贪婪模式)。- 当引擎匹配到
Python时,P和n只是用来定位的锚点,捕获组(.*?)实际抓到的是ytho,所以findall就直接返回这个捕获组的结果了。
想要得到完整的Python,有两种简单的调整方式:
- 用非捕获组:把捕获组改成
(?:.*?),这样括号里的内容就不会被单独捕获,findall就会返回整个匹配的字符串。正则写成r'P(?:.*?)n'。 - 给整个匹配加捕获组:把整个正则用括号包起来,比如
r'(P.*?)n',这样外层的捕获组会把Python完整捕获,findall就返回这个完整内容。
看实际代码示例:
import re text1 = '"Python", "PHP", "Java",' # 非捕获组写法 print(re.findall(r'P(?:.*?)n', text1)) # 输出: ['Python'] # 外层捕获组写法 print(re.findall(r'(P.*?)n', text1)) # 输出: ['Python']
内容的提问来源于stack exchange,提问作者Prakhar
相关产品推荐
相关产品推荐

