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
相关产品推荐
相关产品推荐

