用户把敏感词每个字之间插入 U+200B,正文看起来完全正常,词库匹配结果全是 0,内容直接发布出去了。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
text = re.sub('[\u200b-\u200f\ufeff]', '', raw)
print(len(raw), len(text))
正则按连续字符匹配,中间夹了零宽字符就断开了。清洗流程只去普通空格,零宽空格和方向控制符都留了下来。这一点先确认清楚,后面就不用反复试。
「零宽字符绕过」这类改动最怕改一半,回滚脚本先准备好,再动生产。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。
动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。
具体做法是,入库前过滤 U+200B 到 U+200F 以及 U+FEFF 这些不可见字符;匹配时先把文本压成纯可见字符再跑词库;保留原始文本用于审计,别直接覆盖。
改完照着核一遍,插入零宽字符的评论被拦下,后台能同时看到原文和清洗后文本。
