把日期从 2026/03/05 换成 2026-03-05,用 re.sub(r'(\d+)/(\d+)/(\d+)', '$1-$2-$3', s) 之后字符串一个字都没变。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

python3 -c "import re;print(re.sub(r'(\d+)/(\d+)/(\d+)', r'\g<1>-\g<2>-\g<3>', '2026/03/05'))"

Python 的替换模板用 \1 或 \g<1> 表示分组,$1 是 JavaScript 和 PHP 的写法。这里被当成普通字符,原样写回结果里,看起来就像没执行。这一点先确认清楚,后面就不用反复试。

「正则替换反向引用」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。

改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。

具体做法是,把 $1 改成 \g<1> 兼容分组后紧跟数字的情况;或者用函数做替换参数 自己拼更直观;先拿一行数据验证再跑全量;替换前备份原串 覆盖写容易看不出没生效。

改完照着核一遍,输出变成 2026-03-05 全量 5000 行替换后抽查 5 条格式都正确。

作者 9823189