如何从包含多笔交易数据的文本文件中提取交易明细
交易明细提取实现方案
1. 先明确统一提取字段
提前定义所有交易通用的结构化字段,确保不同类型交易提取的内容格式一致:
- 交易时间
- 交易类型(消费/取现/转账等)
- 支付渠道(借记卡/UPI/Simpl/OlaMoney等)
- 交易对手/消费场景
- 交易金额(单位:Rs)
- 关联凭证(卡号后四位/UPI流水号/交易编号等)
- 账户余额(可选,仅部分交易有该字段)
- 交易分类(对应原文本中
Aggregate under XXX的标记内容)
2. 文本预处理
首先清洗原始文本中的HTML标签(<p>/<code>/<a>等),仅保留纯文本内容;同时将Aggregate under XXX的分类标记单独提取,和该标记之后、下一个分类标记之前的所有交易绑定,作为该批交易的分类标签。
3. 按交易模板编写正则匹配规则
你提供的样例交易都是固定模板的半结构化文本,用正则表达式即可完成精准提取,核心匹配规则如下:
借记卡交易模板
匹配规则:您于(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})通过Debit Card (xx\d{4})在(.*?)(消费|取现)Rs\.?([0-9\.]+),可用余额Avl Bal Rs\.?([0-9\.]+)
对应提取字段:交易时间、卡号后四位、交易对手、交易类型、交易金额、账户余额
HDFC银行UPI转账模板
匹配规则:尾号\*\*(\d{4})账户于(\d{2}-\d{2}-\d{2})向VPA (.*?)支出Rs ?([0-9\.]+)(UPI Ref No (\d+))
对应提取字段:卡号后四位、交易时间、收款账户、交易金额、UPI流水号
先买后付消费模板
- Simpl支付匹配规则:
(.*?)平台消费Rs\.?([0-9\.]+),通过(Simpl)扣款 - OlaMoney支付匹配规则:
您使用(OlaMoney Postpaid)支付(.*?)平台交易.*?的Rs\.? ?([0-9\.]+)款项成功
对应提取字段:支付渠道、消费场景、交易金额
4. 结构化输出
把所有提取到的字段整理成CSV、JSON或者表格形式即可,样例输出如下:
| 交易时间 | 交易类型 | 支付渠道 | 交易对手/场景 | 金额(Rs) | 关联凭证 | 余额(Rs) | 分类标签 |
|---|---|---|---|---|---|---|---|
| 2021-03-25 02:10:37 | 消费 | 借记卡 | AMAZON PAY INDIA PRIVA | 2.00 | xx2217 | 1091.07 | bank withdrawal |
| 2021-06-06 20:27:20 | 取现 | 借记卡 | +UBI NOIDA MAIN | 500.00 | xx1135 | 854.14 | bank withdrawal |
| 06-08-21 | 转账 | UPI | kshreyansnahar@okhdfcbank | 1.00 | 121554846690 | - | UPI |
Python实现参考代码
如果需要批量处理,可以用以下代码快速实现:
首先安装依赖:pip install beautifulsoup4 lxml
核心代码:
from bs4 import BeautifulSoup import re import csv # 读取原始交易文本 with open("交易原始文件.txt", "r", encoding="utf-8") as f: raw_content = f.read() soup = BeautifulSoup(raw_content, "lxml") current_category = "" result = [] for tag in soup.find_all(["p", "code"]): text = tag.get_text(strip=True) # 提取分类标签 if text.startswith("Aggregate under"): current_category = text.replace("Aggregate under", "").strip() continue # 匹配借记卡交易 debit_res = re.search(r"您于(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})通过Debit Card (xx\d{4})在(.*?)(消费|取现)Rs\.?([0-9\.]+),可用余额Avl Bal Rs\.?([0-9\.]+)", text) if debit_res: result.append({ "交易时间": debit_res.group(1), "交易类型": debit_res.group(4), "支付渠道": "借记卡", "交易对手": debit_res.group(3), "金额": debit_res.group(5), "关联凭证": debit_res.group(2), "余额": debit_res.group(6), "分类": current_category }) continue # 其余UPI、先买后付交易匹配逻辑按上面的正则规则补充即可 # 输出为CSV文件 with open("交易明细提取结果.csv", "w", encoding="utf-8-sig", newline="") as f: writer = csv.DictWriter(f, fieldnames=result[0].keys()) writer.writeheader() writer.writerows(result)
内容的提问来源于stack exchange,提问作者Aman Singh
相关产品推荐
相关产品推荐

