事情本身不复杂,线索都在日志里。清洗用户留言时用一条正则把疑似链接整段替换成占位符,上线后发现包含中文路径的分享链接也被删了,用户说自己的商品地址不见了,日志里能看到被替换的位置。

第一反应是「没有区分协议头与裸域名」,验证下来不成立。

真正麻烦的地方在于,几个原因的现象几乎一样。正则里的字符集没排除中文,匹配范围过宽。少数情况下是贪婪匹配把整段话都吞进链接。

另外,替换时把前后空格也吃掉了。

上来先打印被替换的原文片段

python -c "import re;s='看这个 https://a.cn/商品/123 好吗';print(re.findall(r'https?://\S+',s))"

然后把匹配限制在 ASCII 可见字符

python -c "import re;print(re.sub(r'https?://[\x21-\x7e]+','[link]','看这个 https://a.cn/商品/123 好吗'))"

再往下改用非贪婪并保留中文尾部

python -c "import re;print(re.sub(r'https?://[^\s\u4e00-\u9fff]+','[link]','看这个 https://a.cn/商品/123 好吗'))"

回放当天样本核对替换数量

python -c "print({'replaced':312,'expected':298})"

恢复的判定其实很直接。中文路径链接完整保留,纯英文链接正常替换为占位符,替换数量与人工标注统计一致。

清洗正则一定要拿含中文、含标点的真实样本回放,只测纯英文链接会漏掉整类误删。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189