日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

實例10:用Python正則表達式從不規(guī)則的備注欄獲得采購申請單號

 Four兄 2019-08-25

公司研發(fā)部需要常年采購一些新物料,用于新產(chǎn)品開發(fā)。每次采購新物料都需要出一份工程采購申請單(EPR:Engineering purchase request),并有一個編號,格式為“EPR-XX-XXXXX”。由于公司的采購系統(tǒng)中沒有用于填寫EPR編號的欄位,因此采購在系統(tǒng)填單的時候只得填寫到備注欄內(nèi)。備注欄是一個極其不規(guī)范的欄位,每個采購員的風(fēng)格不同,填寫方法也是五花八門,比如如下: 

工程部需要每天從系統(tǒng)導(dǎo)出這些物料的采購信息,然后用vlookup函數(shù)跟其內(nèi)部登記的表格進行匹配,以了解物料交期,制定新產(chǎn)品開發(fā)進度。但是這個采購信息表里的EPR編號實在太不規(guī)范,很難與自己的記錄表匹配,處理起來費時費力。Python正則表達式(規(guī)則表達式)可以輕松地處理這類問題,我們只需要設(shè)定好規(guī)則,可以從一堆亂七八糟的字符串中提取出我們想要的信息。

#1.獲取備注欄的所有信息from openpyxl import load_workbook
wb
=load_workbook('data\采購信息表.xlsx')
ws
=wb['Sheet1']
PR_rawdata
=[]for row in range(2,ws.max_row+1):
PR_rawdata
.append(ws.cell(row=row,column=4).value)
PR_rawdata

>>['...ASIA PACIFIC PO CN..EPR-14-X1224..........',
'...ASIA PACIFIC PO CN..EPR-14-X1224..........',
'...ASIA PACIFIC PO CN..EPR-14-X1224..........',
'...ASIA PACIFIC PO CN..EPR-14-X1224..........',
'...ASIA PACIFIC PO CN..EPR-14-X1224..........',
'...ASIA PACIFIC PO CN..EPR-14-X1224..........',
'...ASIA PACIFIC PO CN..EPR-14-X1224..........',
'...ASIA PACIFIC PO CN..EPR-14-X1207..........',
'...ASIA PACIFIC PO CN..EPR-14-X1207..........',
'...ASIA PACIFIC PO CN..EPR-14-X1214..........',
'...ASIA PACIFIC PO CN.201.EPR-14-X1164..........',
'...ASIA PACIFIC PO CN.201.EPR-14-X1164..........']

首先,我們導(dǎo)入openpyxl模塊的load_workbook方法打開“采購信息表”,獲取“Sheet1”工作表。然后建立一個空列表PR_rawdata,以存儲備注欄對應(yīng)列的信息。隨后從第二行開始遍歷所有行,提取第四列中的信息,使用append方法將其存入空列表PR_rawdata

提取完信息后,可通過len()查看PR_rawdata中元素個數(shù),看看是否有遺漏。我們可以看到有1583個元素,妥妥的。

len(PR_rawdata)>>1583
#2.使用正則表達式獲取PR編號from re import compile, IGNORECASE
def get_EPR_num(text):
#將問號'?' 替換成 '-'
changed_question_mark
= text.replace('?','-')
#獲取EPR編號
epr_num
= compile(r'EPR-\d{2}-X\d{3}(\d)?',IGNORECASE)
match
= epr_num.search(changed_question_mark)
#將小寫EPR轉(zhuǎn)換為大寫并返回
return match.group().upper()

然后我們就開始使用強大的正則表達式。首先導(dǎo)入re模塊中的compileIGNORECASE。re模塊包含正則表達式的所有函數(shù)。compile為正則表達式函數(shù),用于匹配所需要的內(nèi)容;IGNORECASE表示忽略字符串中的大小寫。我們先創(chuàng)建一個函數(shù)get_EPR_num(),以方便后面反復(fù)調(diào)用,其中包含一個參數(shù)text,用于傳入包含EPR編號的字符串,比如“...ASIA PACIFIC PO  CN..EPR-14?X1059..........”。函數(shù)要做的事,就是在這個字符串中按照我們設(shè)定的規(guī)則提取出EPR編號,其結(jié)果應(yīng)該是“EPR-14-X1059”。

有些包含EPR編號的字符串是帶有問號“?”的,比如“EPR-14?X1059”,因此需要先將其替換成我們想要的“-”。我們使用replace('?','-')進行替換。然后向compile中傳入一個字符串r“\S{3}-\d\d\S\S\d{3}(\d)?”,創(chuàng)建正則表達式,并增加參數(shù)IGNORECASE忽略大小寫。最前面的r表示忽略字符串中的轉(zhuǎn)義字符(此例中的“\”是正則表達式規(guī)則的一部分,不是轉(zhuǎn)義字符,若不忽略,將被程序當(dāng)成轉(zhuǎn)義字符而出錯)。其中'\S'指除空格外的所有字符,“{3}”指匹配三次。然后是“-”,接著是兩個數(shù)字“\d{2}”。“-X”之后3或4個數(shù)字,所以用“\d{3}(\d)?”,其中“(\d)?”表示可選匹配,即“-X”后面是3位數(shù)字的話就取3位數(shù)字,是4位數(shù)字就取4位數(shù)字。

正則表達式創(chuàng)建好后,我們就去到原始字符串中去搜索符合條件的項,并存入match變量。最后調(diào)用Match對象的group()方法,并使用upper()將小寫轉(zhuǎn)換為大寫,返回匹配到的字符串,即EPR編號。group()是可以截取分組的字符串,分組是通過在正則表達式中加入括號()來操作,此例未分組,即只有1組。正則表達式常用的符號如下:

PR_list_result=[]for PR in PR_rawdata:
PR_list_result
.append(get_EPR_num(PR))
PR_list_result
>>['EPR-14-X1224',
'EPR-14-X1224',
'EPR-14-X1224',
'EPR-14-X1224',
'EPR-14-X1224',
'EPR-14-X1224',
'EPR-14-X1224',
'EPR-14-X1207',
'EPR-14-X1207',
'EPR-14-X1214',
'EPR-14-X1164',
'EPR-14-X1164',
'EPR-14-X1209',
'EPR-14-X1175']

提取EPR編號的函數(shù)創(chuàng)建好了之后,就可以開始調(diào)用它來處理數(shù)據(jù)了。首先建一個列表PR_list_result來儲存處理后的數(shù)據(jù),然后遍歷PR_rawdata,將其中的每個元素(即包含EPR編號的字符串)傳入函數(shù)get_EPR_num()提取EPR編號,然后存入列表PR_list_result。我們可以看到列表PR_list_result里面就是很規(guī)則的EPR編號了,共有1583個。

len(PR_list_result)>>1583#3.在原工作表新增一列,并寫入獲取到的PR編號
wb1
=load_workbook('data\采購信息表.xlsx')
ws1
=wb1['Sheet1']
i
=0 #計數(shù)器,用于從包含所有EPR編號的列表PR_list_result中逐個取出數(shù)據(jù)for row in range(2,ws.max_row+1):
ws1
.cell(row=row,column=5).value=PR_list_result[i]
i
+=1 #計數(shù)器加1,以提取下一個數(shù)據(jù)
wb1
.save('data\采購信息表_新.xlsx')

數(shù)據(jù)處理完后,就可以寫入到Excel表里面去了。我們在原表中最后一列的后面寫入規(guī)整的EPR編號。所以還是先打開“采購信息表.xlsx”,獲取工作表“Sheet1”。定義一個計數(shù)器i,將其作為索引用于從包含所有EPR編號的列表PR_list_result中逐個取出數(shù)據(jù),其初始值為0,因為列表的索引是從0開始的。然后建立一個for循環(huán),從Excel表的第二行,第5列開始寫入數(shù)據(jù),寫一個數(shù)據(jù),計數(shù)器i加上1,以便寫入下一個數(shù)據(jù)。

數(shù)據(jù)寫完后,使用新的文件名保存文件。最后得到的結(jié)果如下: 

所有源代碼和說明都在Jupyter notebook上完成,所用到的Excel 資料已上傳GitHub, 歡迎Fork或下載到本地隨意玩。。。轉(zhuǎn)載請注明出處,謝謝。

GitHub鏈接:https://github.com/weidylan/Office_Automation_by_Using_Python

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多