re.findall(\d,123fg65h)与re.findall(r\d,123fg65h)的区别一、普通字符串 vs 原始字符串r 前缀普通字符串不带 rPython会先解析字符串内部的转义字符比如\n代表换行、\t代表制表符、\d本意是正则的 “数字”但 Python 会先尝试解析。原始字符串带 rPython会完全忽略转义规则字符串里写的是什么就原样传给正则引擎不会做任何预处理。二、针对例子的具体分析你的例子是\d和r\d我们拆解执行过程1. 执行re.findall(\d,123fg65h)步骤① Python 先解析字符串\dPython 本身没有定义\d为合法转义字符Python 的转义字符只有\n/\t/\\等所以会 “宽容地” 保留\d原样再传给正则引擎。② 正则引擎接收到\d解析为 “匹配单个数字”最终结果是[1,2,3,6,5]。2. 执行re.findall(r\d,123fg65h)步骤① Python 解析原始字符串r\d因为加了rPython 直接把\d原样传给正则引擎不做任何转义处理。② 正则引擎接收到\d解析为 “匹配单个数字”最终结果和上面完全一样[1,2,3,6,5]。因为\d不是 Python 的合法转义字符Python 不会篡改它但如果正则里用到 Python 的合法转义字符比如\n/\t/\\差异就会显现反例匹配 “\n” 这个字符串不是换行符import re # 错误写法普通字符串\n会被Python解析为换行符正则匹配不到目标 print(re.findall(\n, a\nb\nc)) # 结果[\n, \n]匹配到换行符而非\n字符串 # 正确写法原始字符串r\n正则引擎接收到\n匹配目标字符串中的\n print(re.findall(r\n, a\\nb\\nc)) # 结果[\\n, \\n]匹配到\n字符串总结在你的例子中\d和r\d最终结果完全相同因为\d不是 Python 的合法转义字符。原始字符串r是正则表达式的推荐写法避免 Python 转义规则和正则转义规则冲突比如匹配\时r\\比\\\\更简洁易读。核心原则写正则时优先用原始字符串加 r能杜绝绝大部分转义相关的坑。