python文本处理需用re模块精准清洗脏数据并提取结构化信息:先清除零宽字符、html标签等,再用strip()和replace()规范空白;邮箱、手机号、日期等正则需加b防误匹配;替换宜用函数控制逻辑,调试时结合findall、compile及regex101验证。

字符串清洗和正则表达式是Python文本处理的核心技能,关键在于理解常见脏数据模式,并用re模块精准匹配与替换。
识别并清理典型脏数据
真实文本常含多余空格、不可见字符(如 u200b、xa0)、中英文标点混用、HTML标签、乱码符号等。清洗不是“删光所有非字母”,而是按业务目标保留有效信息。
- 用
strip()去首尾空白,replace('xa0', ' ')把不间断空格转为空格 - 对整段文本,先
re.sub(r'[u200bu200cu200duFEFF]', '', text)清除零宽字符 - 用
html.unescape()解码HTML实体(如→),再配合re.sub(r']+>', '', text)删标签
用正则表达式精准提取结构化信息
正则不是万能,但对固定格式内容(手机号、邮箱、日期、ID号)效率极高。关键是写“够用且不易误匹配”的模式。
- 邮箱:
r'b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Z|a-z]{2,}b'——加b防匹配到长字符串中间 - 中文手机号(大陆):
r'1[3-9]d{9}',比r'1d{10}'更准确,排除10位或12位伪号 - 带分隔符的日期(如2023-05-12):
r'bd{4}[-/.]d{1,2}[-/.]d{1,2}b',注意转义点号
安全替换与动态处理
用re.sub()时,避免直接传入未校验的字符串做替换内容;复杂逻辑建议用函数作为replacement参数。
立即学习“Python免费学习笔记(深入)”;
- 统一电话格式:将
'010-1234-5678'、'13812345678'都转为'138-1234-5678',可写函数判断长度后格式化 - 敏感词脱敏:用
re.sub(r'(身份证|ID|证件号)s*[::]?s*(w+)', r'1: ****', text),捕获组让替换更可控 - 慎用
re.DOTALL和re.MULTILINE——除非真需要跨行匹配,否则默认行为更稳定
调试与验证技巧
正则写完别急着集成,先在小样本上验证边界情况。
- 用
re.findall()看是否漏匹配或多匹配,比如测试邮箱正则时,输入'contact@abc.com.cn'和'fake@abc.comx' - 在
re.compile()后加pattern.pattern打印原始正则,确认转义正确(如r'.' → .) - 用
regex101.com(选Python flavor)可视化匹配过程,尤其查贪婪/非贪婪(.*vs.*?)