用 \b测试\b 去匹配一批 200 条中文短句里的 测试,命中 0 条。换成英文单词立刻正常,加上中文标点也不行。日志里能对上时间点,这种反而好排。
\b 判断的是 \w 和非 \w 的交界,Python 默认 \w 只含 ASCII 字母数字下划线,汉字两侧都被当成非单词字符,就没有边界可判。这一点先确认清楚,后面就不用反复试。
python -c "import re; print(re.sub(r'(?<![\u4e00-\u9fa5])测试(?![\u4e00-\u9fa5])', 'X', '这是测试,测试用例'))" python -c "import re; print(re.findall(r'\b测试\b', '这是测试'))"
「正则单词边界」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。
报错里带路径的,先去看那个路径在不在、权限对不对。同一份配置存在多处的,先确认改的是被加载的那一份。
新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
处理上按这个顺序:中文场景不要用 \b 做边界;用前后否定断言自己写边界 排除汉字范围;或开启 re.UNICODE 并确认 \w 的覆盖范围;把替换结果抽样人工核对 避免误替换。
结果对不对很好判断,只替换独立出现的 测试 不误伤 测试用例 里的部分。
