You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python提取CSV中不符合规则的control_number?

提取CSV中不符合规则的control_number

我有一个包含多列支付数据的CSV文件,其中control_number是每笔交易的唯一标识符,合法格式要求:

  • 以991开头
  • 长度为12位纯数字

需要提取所有不符合该规则的control_number列表。

原代码问题

当前代码存在两个核心问题:

  1. 正则表达式错误:(?<!\d)\d{5}(?!\d)匹配的是独立的5位数字,和要求的12位、991开头的规则完全不符
  2. 方法使用错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 23:12:21