公司研發(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ī)則,可以從一堆亂七八糟的字符串中提取出我們想要的信息。
首先,我們導(dǎo)入openpyxl模塊的load_workbook方法打開“采購信息表”,獲取“Sheet1”工作表。然后建立一個空列表PR_rawdata,以存儲備注欄對應(yīng)列的信息。隨后從第二行開始遍歷所有行,提取第四列中的信息,使用append方法將其存入空列表PR_rawdata。 提取完信息后,可通過len()查看PR_rawdata中元素個數(shù),看看是否有遺漏。我們可以看到有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模塊中的compile及IGNORECASE。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組。正則表達式常用的符號如下:
提取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個。
數(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 |
|
來自: Four兄 > 《Python辦公》