全文以工商银行的扣费信息为例
工行储蓄卡,绑定支付宝、微信后日常使用,偶尔会转入,日常收到的通知短信有支付、转入、信使展期扣费三类:
1. 您尾号1234卡1月2日20:57POS支出(快捷支付)100元,余额664.88元。【工商银行】
2. 您尾号7256卡2月3日15:35ATM收入(现存)8,000元,余额8,664.88元。【工商银行】
3. 您尾号1234卡4日02:55工商银行支出(信使展期)2元,余额8,662.88元。【工商银行】
最后的整理结果如图
screenshot.png需要从每条短信中提取出来的信息有:日期、金额、方式、余额
第一、二类短信具有相同的格式,可以用同一个正则表达式提取信息,第三类缺少了一个日期,需要另写一个(存储的时候月份用00
代替)。
第一个正则表达式为:您尾号(\d{4})卡(\d{1,2})月(\d{1,2})日([\d:]+)(.+?)([\d.,]+)元,余额([\d.,]+)元。【工商银行】
第二个正则表达式为:您尾号(\d{4})卡(\d{1,2})日([\d:]+)(.+?)([\d.,]+)元,余额([\d.,]+)元。【工商银行】
,区别在于少了月份。
留意扣费方式的匹配用了非贪婪模式 ?
读 xls 要用到 xlrd ,而本次是要写入 xls ,所以用的是 xlwt 模块
file = xlwt.Workbook() #新建文件,留意大小写
table = file.add_sheet('name') #新建一个sheet
table.write(行,列,值) #写入数据
table = file.add_sheet('sheet name',cell_overwrite_ok=True) #需要对同一个单元格重复写入覆盖数据
file.save('demo.xls') #保存文件
......
还能自定义字体等
参考信息:xlwt 1.2.0 : Python Package Index
6.2. re — Regular expression operations — Python 3.6.2 documentation
最终代码如下
#!/usr/bin/python3
# -*- coding:utf-8 -*-
import re,xlwt
common = re.compile(u'您尾号(\d{4})卡(\d{1,2})月(\d{1,2})日([\d:]+)(.+?)([\d.,]+)元,余额([\d.,]+)元。【工商银行】')
notify_fee = re.compile(u'您尾号(\d{4})卡(\d{1,2})日([\d:]+)(.+?)([\d.,]+)元,余额([\d.,]+)元。【工商银行】')
xls = xlwt.Workbook()
table = xls.add_sheet(u'账单')
table.write(0,3,'方式')
table.write(0,4,'用途')
table.write(0,5,'余额')
table.write(0,6,'备注')
def f(month,day,reason,fee,remain,line):
while(len(month) < 2):
month = '0' + month
while(len(day) < 2):
day = '0' + day
if '.' in fee:
fee = float(fee.replace(',',''))
else:
fee = int(fee.replace(',',''))
if '出' in reason:
fee = -fee
remain = float(remain.replace(',',''))
remain = round(remain,2)
table.write(line,1,month+day)
table.write(line,2,fee)
table.write(line,3,reason)
table.write(line,5,remain)
if __name__ == '__main__':
with open('bank.txt','r') as file:
current = 1
for line in file.readlines():
line = line.strip()
r1 = common.match(line)
r2 = notify_fee.match(line)
if r1:
f(r1.group(2),r1.group(3),r1.group(5),r1.group(6),r1.group(7),current)
current = current + 1
elif r2:
f('',r2.group(2),r2.group(4),r2.group(5),r2.group(6),current)
current = current + 1
else:
print('other #' + line.strip())
xls.save('result.xls')
欢迎留言共同改进程序~
来自个人 Python 文集
网友评论