如何使用Pandas组合独立正则表达式并批量处理数据集行提取格式化内容
最终整合方案
核心匹配正则
按高优先级长模式在前、低优先级短模式在后的原则整合,避免短规则截断长编号的问题,完整正则为:r"\d{2,3}-\d{3}-\d{3}\w*|\d{2}-\d{4}\w?|[A-Z][a-z]+"
分支匹配规则说明
- 第一分支(最高优先级):匹配长编号,严格对应规则2:2-3位数字开头,通过两个连字符分隔3位数字的三段结构,允许编号后跟随单词字符作为后缀,不会截断长编号的前半段
- 第二分支:匹配短编号,严格对应规则3:2位数字开头,连字符后接4位数字,允许末尾带1个单字符后缀,因为严格限制了数字段长度,不会误匹配长编号的片段
- 第三分支:匹配人名,对应规则1:仅识别首字母大写、后续为小写字母的连续英文单词,避免将全小写的连接词(如
and)误判为人名
Pandas 实现代码
import pandas as pd import re # 定义整合后的匹配规则 COMBINED_RULE = r"\d{2,3}-\d{3}-\d{3}\w*|\d{2}-\d{4}\w?|[A-Z][a-z]+" # 基于输入列生成Wanted新列 df["Wanted"] = df["Column0"].str.findall(COMBINED_RULE).str.join(", ")
匹配效果验证
对示例测试串的输出完全符合预期:
| Column0 | Wanted |
|---|---|
| Alice\t12-345-623/ 10-1234 | Alice, 12-345-623, 10-1234 |
| Bob 201-888-697 / 12-0556a | Bob, 201-888-697, 12-0556a |
| Tim 073-110-101 / 13-1290 | Tim, 073-110-101, 13-1290 |
| Joe 74-111-333/ 33-1290 and Amy(12-345-623)/10-1234c | Joe, 74-111-333, 33-1290, Amy, 12-345-623, 10-1234c |
之前匹配异常的原因
- 原有代码使用
re.search仅提取第一个匹配项,无法收集整行所有目标内容,需要替换为findall遍历全串匹配 - 短编号规则设置过松:允许2-3位数字开头、后接3-4位数字,导致长编号的前两段(如12-345)被误判为短编号匹配
- 正则分支顺序倒置:短规则排在长规则之前,被优先匹配截断了长编号内容
- 人名匹配无边界:未限定首字母大写特征,会混入非目标的普通英文单词
内容的提问来源于stack exchange,提问作者Kevin Zehnder
相关产品推荐
相关产品推荐

