如何用Python提取CSV中不符合规则的control_number?
提取CSV中不符合规则的control_number
我有一个包含多列支付数据的CSV文件,其中control_number是每笔交易的唯一标识符,合法格式要求:
- 以
991开头 - 长度为12位纯数字
需要提取所有不符合该规则的control_number列表。
原代码问题
当前代码存在两个核心问题:
- 正则表达式错误:
(?<!\d)\d{5}(?!\d)匹配的是独立的5位数字,和要求的12位、991开头的规则完全不符 - 方法使用错误:
re.findall无法直接处理pandas的Series对象,应该使用pandas提供的字符串矢量化方法
修正后的代码
import pandas as pd # 读取CSV文件 df = pd.read_csv("transactions.csv") # 定义合法control_number的正则规则:以991开头,后续9位数字,总长度12位 valid_pattern = r"^991\d{9}$" # 筛选出不符合规则的记录:~表示取反,str.fullmatch确保整个字符串完全匹配规则 invalid_records = df[~df['control_number'].astype(str).str.fullmatch(valid_pattern)] # 提取control_number列并输出 print(invalid_records[['control_number']]) # 可选:将结果保存到新CSV文件 invalid_records[['control_number']].to_csv("invalid_control_numbers.csv", index=False)
代码说明
astype(str):确保control_number被当作字符串处理,避免数字类型导致的前导零丢失问题(实际场景可能存在)str.fullmatch(valid_pattern):检查整个字符串是否完全匹配正则规则,返回布尔类型的Series~:对布尔Series取反,筛选出不满足规则的记录- 最终输出的
invalid_records[['control_number']]即为不符合规则的列表,与示例期望输出完全一致
示例验证
使用你提供的示例数据运行代码,会得到如下结果:
| control_number |
|---|
| 992100267635 |
| 995100267696 |
| 990100267779 |
内容的提问来源于stack exchange,提问作者tony michael
相关产品推荐
相关产品推荐

