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

Python使用正则表达式时如何处理可能为空的捕获组

正则提取PDF交易数据的修正方案

原有代码的核心问题

  • 金额匹配规则错误:方括号[]内仅能定义匹配的字符集合,原有规则[\d\.\d,\d{2}]+属于语法误用,无法正确匹配千分位带点、小数位带逗号的欧洲格式金额
  • 分组逻辑混乱:将多组日期/金额/备注强制揉在单个正则分支中,可选标记?的使用逻辑错误,导致无法匹配后续列和带备注的最后一行
  • 重复调用匹配方法:循环内多次执行values.search()会造成不必要的性能损耗,也容易出现匹配结果不一致的问题

修正后的实现逻辑

采用正则匹配单组日期+金额+可选备注的结构,通过findall()一次性提取单行内所有符合规则的三元组,不用手动处理多列的可选逻辑,兼容性更强。

可运行代码

import re
import pandas as pd

# 匹配单组 日期(必选) + 金额(必选) + 备注(可选,仅大写字母)
pattern = re.compile(r'(\d{2}/\d{4})\s+(\d{1,3}(?:\.\d{3})*,\d{2})(?:\s+([A-Z]+))?')

all_data = []
# 跳过表头行,从第二行开始遍历
for line in text.split('\n')[1:]:
    line = line.strip()
    if not line:
        continue
    # 提取当前行所有匹配的三元组
    matches = pattern.findall(line)
    all_data.extend(matches)

# 转成DataFrame
df = pd.DataFrame(all_data, columns=['Date', 'Amount', 'Remarks'])
# 空备注统一处理为空字符串
df['Remarks'] = df['Remarks'].fillna('')
print(df)

运行效果

最终生成的DataFrame包含所有行的日期、金额、备注信息,最后一行的ABC备注也会被正常识别,无备注的行对应字段留空。

内容的提问来源于stack exchange,提问作者Carlos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:24:03