高效文本清洗需分层处理:先用beautifulsoup移除script等干扰区块再get_text(),必须用正则时加re.dotall并非贪婪匹配;合并标点用re.sub(r'[。!?;]+', '。', text),清理零宽字符需单独处理,提取多字段优先用re.findall()。

直接用 re.sub() 一次性通吃所有噪声,基本等于给后续分析埋雷。真正高效的清洗是分层、带上下文约束、且明确每一步目标。
先去HTML标签,但别信 r']+>' 能搞定一切
这个模式能清掉大部分单层标签(比如 <p></p>、<div class="...">),但它对嵌套结构(如 <code><script>console.log("<div>")</script>)和自闭合标签(<img src="x">)完全无感,容易把内容截断或漏掉残留符号。
- 优先用
BeautifulSoup的.decompose()干掉script、style、nav等干扰区块,再调用.get_text() - 如果必须用正则清理残留标签(比如从已提取的文本里再扫一遍),可加
re.DOTALL让.匹配换行,并用非贪婪?:re.sub(r']*?>', '', text, flags=re.DOTALL) - 注意:别在没
.strip()的情况下直接替换,否则可能留下首尾空格或换行
合并冗余标点和空白时,要区分“语义空格”和“噪声空格”
re.sub(r'\s+', ' ', text) 是常用写法,但它会把段落间换行也压成空格,破坏原文结构;而 re.sub(r'[ ]+', ' ', text) 只处理空格,对制表符或换行无效——得按需选。
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
- 统一空白符(保留段落逻辑):
re.sub(r'[ \t]+', ' ', text)→ 只压缩空格和制表符 - 合并连续换行(保留段落间距):
re.sub(r'\n\s*\n', '\n\n', text)→ 把多个空行缩成一个 - 中文句末标点去重:
re.sub(r'[。!?;]+', '。', text),避免「!!!」变成「!」后丢失语气强度 - 零宽字符必须单独清:
re.sub(r'[\u200b\u200c\u200d\ufeff]+', '', text),否则.strip()完全无效
提取字段时,re.findall() 比 re.search() 更贴近真实需求
网页文本里关键信息往往重复出现(比如多个电话、邮箱、价格),re.search() 只返回第一个,而 re.findall() 直接给你列表,开箱即用。
- 单字段提取(返回字符串列表):
re.findall(r'联系电话:(\d{11})', text) - 多字段提取(返回元组列表):
re.findall(r'姓名:(\S+), 地址:([^\n]+)', text),其中[^\n]+比.*?更安全,防跨行吞内容 - 中文提取慎用
\w:re.findall(r'[\u4e00-\u9fff]+', text)才能覆盖汉字,\w在默认模式下只认 ASCII 字母数字 - 字段可能缺失时,别强求完整匹配——用
re.search()分别查每个字段更可控
预编译正则不是性能银弹,写错反而拖慢整个流程
在循环里反复调用 re.sub(pattern, ...) 确实该预编译,但多数清洗脚本只跑一次,盲目 re.compile() 反而增加维护成本,且错误更隐蔽。
- 编译失败常见原因:
r'\d{3}-\d{4}'写成'd{3}-d{4}'(漏了反斜杠)、括号不配对、用了高版本才支持的语法(如条件断言) - 调试技巧:打印
re.compile(pattern).pattern看原始字符串,再用re.compile(pattern).findall('test')快速验证 - 如果正则里含变量,用
f-string或str.format()拼接后,再编译——别在re.sub()里动态拼接未编译模式
最易被忽略的是:清洗顺序不能颠倒。比如先合并空白再删 HTML 标签,可能导致标签内部空格被误压;先提字段再清洗,又可能让正则匹配到残留噪声。每一步都得想清楚“这步依赖什么,又会影响什么”。










