Python中re.findall匹配转义序列结果不符预期的原因探究
问题原因及解决方法
核心问题有两个:
- re.findall的行为特性:当正则表达式中存在捕获组时,findall会优先返回捕获组的匹配结果,而非整个正则表达式匹配的完整字符串。
- 重复捕获组的覆盖问题:你写的
(\\\d+)+是一个被重复匹配的捕获组,每次匹配到新的\数字序列时,都会覆盖之前捕获组存储的内容,最终只保留最后一次匹配的结果(也就是\125)。
解决办法
方法1:使用非捕获组
把重复的匹配部分改成非捕获组(用(?:...)包裹),这样正则里没有捕获组,findall就会返回整个匹配的字符串:
import re matches = re.findall(r'\"(?:\\\d+)+\"', r'\"\123\124\125\"') print(matches) # 输出: ['"\\123\\124\\125"']
方法2:捕获整个目标字符串
给整个要匹配的内容加一个外层捕获组,之后提取捕获组的第一个元素:
import re matches = re.findall(r'(\"(\\\d+)+\")', r'\"\123\124\125\"') print([item[0] for item in matches]) # 输出: ['"\\123\\124\\125"']
内容的提问来源于stack exchange,提问作者Aria Nova
相关产品推荐
相关产品推荐

