15、正则表达式在数据清洗与文本提取中的应用
2000/1/15大约 2 分钟
正则表达式在数据清洗与文本提取中的应用
面对非结构化文本时,正则表达式是数据工程师与分析师手中的利器。本篇聚焦于实际业务中的常见清洗、提取任务与最佳实践。
清洗流程概览
- 输入规范化:统一编码、去除 BOM、转换换行符。
- 预处理:使用简单替换去除噪音,如多余空格、HTML 标签。
- 结构化抽取:编写正则表达式提取关键字段。
- 验证与持久化:校验抽取结果,并存入数据库或数据仓库。
Python 中的批量清洗示例
import regex as re
pattern = re.compile(r"(?P<name>[\p{L}\.\s]+)\s+-\s+(?P<email>[\w.-]+@[\w.-]+)")
records = []
for line in lines:
clean = line.strip()
match = pattern.search(clean)
if match:
records.append(match.groupdict())提示:标准库
re未支持\p{},此处使用第三方regex模块;若无法安装,可在预处理阶段替换为自定义字符类。
批量替换中的断言技巧
- 使用前瞻:
(?<=关键字)\d+定位关键字后的编号。 - 使用后顾:
(?<!http)://用于剔除双斜杠但保留 URL。 - 同时使用:
(?<=票号\s)\d+(?=\s*已出票)匹配上下文明确的数字。
提取结构化数据
日志字段拆分
const logPattern = /^(?<time>\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d+)\s+(?<level>INFO|WARN|ERROR)\s+(?<message>.*)$/;使用命名捕获可以直接生成结构化对象,便于后续分析。
HTML 中的表格抽取
const cell = /<td\s+data-column="(?<column>[^"]+)">(?<value>.*?)<\/td>/gis;在无法使用 DOM 解析器的场景(如数据源不完整)下,正则表达式可以作为应急方案,但应结合清洗逻辑避免跨标签匹配。
大规模数据处理注意事项
- 流式处理:逐行读取文件,避免加载进内存。
- 编译缓存:在循环外编译正则,减少重复开销。
- 错误处理:对无法匹配的数据记录日志,以便人工复核。
与其他技术的协同
- 结合 SQL:在数据库中使用
REGEXP_REPLACE、REGEXP_SUBSTR实现近实时清洗。 - 配合 ETL 工具:在 Airflow、DBT 等流程中引入正则步骤。
- 与自然语言处理结合:先使用正则标注特定实体,再交由 NER 模型精细识别。
小结
正则表达式在数据清洗与提取中扮演着快速、高效的角色。通过规范流程、合理设计模式并结合其他工具,可以大幅提升数据处理的准确度与可维护性。