Python非贪婪正则为何仍匹配整串而非目标子串?
正则表达式贪婪性的误区解析
你的问题核心是混淆了?在正则里的两种不同用法:
- 你写的
(tt.+tt)?里的?,是作用在整个分组上的可选标记,意思是这个分组的内容可以出现0次或1次,完全没有改变+的贪婪属性。 - 而
+本身是贪婪量词,会尽可能匹配最长的符合条件的内容,所以tt.+tt会从第一个tt开始,一直匹配到最后一个tt,把整个字符串都包含进去,加上?只是让这个匹配变成可选,但只要能匹配到,还是优先选最长的结果。
如果你想提取_second_(也就是最后一对tt之间的内容),需要做两个调整:
- 把贪婪的
+改成非贪婪的+?,让它匹配最短的符合条件的内容; - 加上否定前瞻,确保匹配的是最后一组
tt,避免匹配前面的tt_firstbutnotlast_tt。
对应的Python代码示例:
import re input_string = "tt_firstbutnotlast_tt_second_tt" # 匹配最后一对tt之间的内容 pattern = r"tt(.*?)tt(?!.*tt)" match_result = re.search(pattern, input_string) if match_result: print(match_result.group(1)) # 输出: _second_
如果只是想让tt.+tt匹配最短的可能(也就是第一组tt到第二个tt的部分),只需要把+改成+?即可,也就是用(tt.+?tt),但这和你想要的_second_无关,需要根据实际需求调整模式。
内容的提问来源于stack exchange,提问作者Tiago Stein
相关产品推荐
相关产品推荐

