Python正则匹配实战:用str.extract高效提取结构化数据

2026年04月14日/ 浏览 7

正文:

在数据分析中,我们常遇到非结构化文本需要提取关键信息的场景。比如从客服日志提取订单号,或从网页源码抓取特定标签内容。传统字符串方法处理这类需求往往力不从心,而str.extract配合正则表达式却能优雅解决。

一、str.extract核心机制

str.extract是pandas Series对象的方法,其核心优势在于:
1. 直接返回DataFrame结构
2. 支持多捕获组的分列提取
3. 自动处理缺失匹配

基础语法如下:

df['新列'] = df['文本列'].str.extract(r'正则表达式', flags=re.IGNORECASE)

二、电商数据清洗实战

假设我们有包含商品信息的原始文本:
"【爆款】iPhone15 128G ¥6999 | 库存:237件"
"华为Mate60 Pro+ ¥8999 (限时补贴)"

需要提取品牌、型号、价格三要素:

import pandas as pd
import re

data = pd.Series([
    "【爆款】iPhone15 128G ¥6999 | 库存:237件",
    "华为Mate60 Pro+ ¥8999 (限时补贴)"
])

pattern = r'(华为|iPhone)(\w+\s?\w+?)\s¥(\d+)'
result = data.str.extract(pattern)
result.columns = ['品牌','型号','价格']

输出结果:
品牌 型号 价格
0 iPhone 15 128G 6999
1 华为 Mate60 Pro+ 8999

三、高级匹配技巧

  1. 非贪婪匹配:用.*?避免过度捕获
  2. 前后断言(?<=¥)\d+匹配价格而不包含¥符号
  3. 条件分支(苹果|安卓)\s?(?:手机|平板)匹配不同设备类型

处理HTML文本时典型示例:

html = "<div class='price'>¥<span>599</span></div>"
price = pd.Series(html).str.extract(r'<span>(\d+)</span>')[0]

四、避坑指南

  1. 中文匹配务必用re.UNICODE标志
  2. 复杂正则建议分步验证:
    python
    re.compile(r'pattern').match(test_str).groups()
  3. 性能优化:对百万级数据先用str.contains过滤有效行
picture loss