通用正则清理函数采用分层设计:基础层统一空白与编码残留;业务层按需插拔去广告、删联系方式、水印过滤等规则;安全层通过re.escape、re.subn和dry_run保障防误删与可追溯;扩展点支持pre/postprocess钩子、context感知及结构化输出removed_spans。

写一个通用正则清理函数,核心不是堆砌规则,而是分层设计:先做安全基础清洗(如空白、编码残留),再按需叠加业务规则(如去广告、删水印),最后留出扩展口子。关键在可配置、易调试、不误伤。
基础层:统一空白与编码残留
几乎所有脏文本都逃不开换行混乱、多余空格、HTML实体或Unicode控制符。这部分必须默认启用,且顺序固定:
- 用
、、\u200b-\u200f等匹配常见不可见字符,统一替换成普通空格 - 把连续空白(含制表、换行、全角空格)压缩为单个半角空格,再 trim 首尾
- 解码常见 HTML 实体(如
&→&,→ <code>),但跳过已解码内容,避免重复处理
业务层:按场景插拔式规则
把高频需求拆成独立规则项,每个规则带开关和优先级,比如:
-
去广告标记:匹配
【广告】|广告时间|^\s*[-—★☆]+\s*$这类明显标识,用re.MULTILINE模式逐行扫 - 删联系方式:区分宽松模式(删所有手机号/邮箱)和保守模式(只删带“微信”“电话”字样的整行)
- 水印过滤:针对“© 2024 XXX官网”“本文转载自XXX”等固定句式,支持模糊匹配(允许中间有空格或标点变形)
安全层:防误删与可追溯
正则一跑就删错,往往因为贪婪匹配或边界不清。必须加三道保险:
- 所有替换前加
re.escape()处理用户传入的关键词,防止正则元字符注入 - 用
re.subn()而非re.sub(),返回(结果, 替换次数),便于日志记录或阈值拦截(如单次删超5处触发告警) - 提供
dry_run=True开关,只返回将被删的位置和原文片段,不实际修改
扩展点:预留钩子与上下文感知
纯正则搞不定时(比如“第一页”要删,“第二页”保留),就得让函数能接入外部逻辑:
- 支持传入
preprocess和postprocess函数,在正则前后做字符串预处理或语义修正 - 给每条规则加
context参数,例如水印规则可指定“只在段首30字符内生效”,避免误杀正文 - 输出结构化结果:不仅返回干净文本,还附带
removed_spans: [(start, end, reason), ...],方便审计或回滚











