全文以工商銀行的扣費(fèi)信息為例
工行儲(chǔ)蓄卡辉川,綁定支付寶、微信后日常使用乓旗,偶爾會(huì)轉(zhuǎn)入屿愚,日常收到的通知短信有支付妆距、轉(zhuǎn)入娱据、信使展期扣費(fèi)三類:
1. 您尾號(hào)1234卡1月2日20:57POS支出(快捷支付)100元盅惜,余額664.88元忌穿“橥【工商銀行】
2. 您尾號(hào)7256卡2月3日15:35ATM收入(現(xiàn)存)8,000元妆棒,余額8,664.88元糕珊∫阍悖【工商銀行】
3. 您尾號(hào)1234卡4日02:55工商銀行支出(信使展期)2元,余額8,662.88元喇肋〉溃【工商銀行】
最后的整理結(jié)果如圖
需要從每條短信中提取出來(lái)的信息有:日期间学、金額低葫、方式嘿悬、余額
第一水泉、二類短信具有相同的格式茶行,可以用同一個(gè)正則表達(dá)式提取信息畔师,第三類缺少了一個(gè)日期,需要另寫一個(gè)(存儲(chǔ)的時(shí)候月份用00
代替)看锉。
第一個(gè)正則表達(dá)式為:您尾號(hào)(\d{4})卡(\d{1,2})月(\d{1,2})日([\d:]+)(.+?)([\d.,]+)元姿锭,余額([\d.,]+)元塔鳍。【工商銀行】
第二個(gè)正則表達(dá)式為:您尾號(hào)(\d{4})卡(\d{1,2})日([\d:]+)(.+?)([\d.,]+)元呻此,余額([\d.,]+)元轮纫。【工商銀行】
焚鲜,區(qū)別在于少了月份掌唾。
留意扣費(fèi)方式的匹配用了非貪婪模式 ?
讀 xls 要用到 xlrd ,而本次是要寫入 xls 忿磅,所以用的是 xlwt 模塊
file = xlwt.Workbook() #新建文件糯彬,留意大小寫
table = file.add_sheet('name') #新建一個(gè)sheet
table.write(行,列,值) #寫入數(shù)據(jù)
table = file.add_sheet('sheet name',cell_overwrite_ok=True) #需要對(duì)同一個(gè)單元格重復(fù)寫入覆蓋數(shù)據(jù)
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'您尾號(hào)(\d{4})卡(\d{1,2})月(\d{1,2})日([\d:]+)(.+?)([\d.,]+)元,余額([\d.,]+)元葱她×冒牵【工商銀行】')
notify_fee = re.compile(u'您尾號(hào)(\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')
歡迎留言共同改進(jìn)程序~
來(lái)自個(gè)人 Python 文集