用re.sub()一次性清除常见噪声更高效:预编译正则模式,如re.sub(r'', '', text)删html标签、re.sub(r'\s+', ' ', text)统一空白符,配合re.unicode支持多语言字符清洗。> ↩

怎样用 re.sub() 一次性清除常见噪声
直接删掉干扰信息比逐个判断更高效。比如网页抓取后残留的 HTML 标签、多余空白符、乱码符号,用 re.sub() 配合预编译正则能显著提速。
- 先用
re.compile()编译常用模式,避免重复解析(尤其在循环中) -
re.sub(r']+>', '', text)清 HTML 标签,但注意它不处理嵌套或自闭合标签(如<br>
),简单场景够用 - 连续空白(含换行、制表)统一替换成单个空格:
re.sub(r'\s+', ' ', text),末尾再用.strip() - 中文文本慎用
\w—— 它只匹配 ASCII 字母数字,会漏掉汉字;改用[\u4e00-\u9fff\w]或[\p{Han}\w](需启用re.UNICODE或用regex库)
为什么 re.findall() 比 split() 更适合提取关键字段
非结构化文本里,目标信息往往藏在固定模式前后(比如“订单号:123456”或“价格¥89.9”),re.findall() 能精准捕获,而 split() 容易因格式微变崩掉。
- 用分组提取更可靠:
re.findall(r'订单号:(\d+)', text)直接拿到数字列表,不用再切片或索引 - 多个字段一起提:
re.findall(r'姓名:(\S+),电话:(\d{11})', text)返回元组列表,注意\S+比.*?更安全(避免跨字段吞内容) - 如果字段可能缺失,别硬写贪婪匹配 ——
.*?在长文本中容易回溯爆炸,优先用否定字符集,例如匹配“地址:”后面非换行内容:地址:([^\n]+)
怎样避免 re.match() 和 re.search() 的误用陷阱
re.match() 只从开头匹配,而实际文本常有前导空格、注释或无关行 —— 90% 的“没匹配上”问题出在这里。
- 除非明确要验证整行格式(如日志开头时间戳),否则默认用
re.search() -
re.fullmatch()很少用得上:它要求整个字符串完全匹配模式,连首尾空白都不容,调试时容易误判 - 检查匹配结果是否为
None再取.group(),否则直接调用会抛AttributeError - 用
re.escape()包裹动态插入的字符串(比如用户输入的关键词),防止特殊字符被当正则语法解析
中文文本清洗时哪些 Unicode 范围必须手动加进正则
Python 默认 re 对中文支持有限,不声明 re.UNICODE 或写死范围,很多汉字、标点会漏掉或错判。
- 常用中文字符范围:
[\u4e00-\u9fff](基本汉字)、[\u3000-\u303f\u3040-\u309f\u30a0-\u30ff](全角标点、平假名、片假名) - 中文括号、破折号、省略号不是 ASCII:
[\u3001-\u3003\uff08\uff09\uff0d\uff5e],漏掉会导致清洗后残留 - 微信/微博文本常见 emoji,
re原生库无法可靠识别,建议用emoji库预处理,或简单过滤掉[\U00010000-\U0010ffff](需re.UNICODE) - 繁体字、生僻字不在基础范围,若需覆盖,查 Unicode 区块(如 \u3400-\u4dbf)并追加,但会拖慢匹配速度
正则清洗不是万能的——嵌套结构(如带格式的表格、缩进代码块)或语义依赖上下文的内容(如“他说‘明天’”里的引号归属),靠正则容易翻车。先做最小可行清洗,再交规则引擎或 NLP 模型处理更稳妥。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











