Python正则表达式捕获组问题:如何捕获目标数字73?
解决正则捕获只得到最后一位数字的问题
嘿,作为有Perl基础的开发者,你肯定懂正则的基本逻辑,但刚转Python没反应过来——你遇到的问题就是贪婪匹配在搞怪!
先看你的原代码:
a='Question 73 of 2943' import re re.match("Question.*(\d+)\s+of", a).group(1) # 输出 '3'
为什么会只拿到3?因为.*是贪婪模式,它会尽可能多地匹配字符:从"Question"之后开始,它会一直匹配到离" of"最近的位置,把"7"也包含进去,只留下最后一个数字3给括号里的\d+。
给你两个靠谱的解决方案:
方案1:用非贪婪匹配(.*?)
把.*改成.*?,让它匹配尽可能少的字符,这样遇到第一个数字序列就会停下来,正好捕获到73:
re.match("Question.*?(\d+)\s+of", a).group(1) # 输出 '73'
方案2:更精准的匹配(推荐)
既然你要匹配的是"Question"后面跟着空格加数字,完全不用模糊的.*,直接用\s+匹配空格,这样更高效也更清晰:
re.match("Question\s+(\d+)\s+of", a).group(1) # 输出 '73'
这种写法更符合正则的“精准匹配”原则,避免了贪婪/非贪婪的歧义,以后维护也更省心。
其实Perl里的正则规则和Python是一致的,只是你可能之前没碰到这种场景~ 试试上面的方法,应该就能拿到你想要的73啦!
内容的提问来源于stack exchange,提问作者Joel G Mathew
相关产品推荐
相关产品推荐

