一,把不規則數據按照正則匹配提取拆分
需求:
1.原文件中的內容呈現. 把姓名中的電話號碼提取出來生成新的列追加
2. 生成結果的內容呈現
二, 代碼的呈現
思路:
1. 加載excel類便於讀取Excel中的數據內容
2. 通過正則表達式來獲取到數字及數字以外的字符串.這樣做就可以對於excel中的第一列內容進行拆分把數字跟字符區分開來
3. 為了文件不被覆蓋。把編輯后的文件重新保存到新的excel中
三,代碼的呈現
1 # -*- coding:utf-8 2 3 import openpyxl 4 import re 5 # 1. 數據指向excel中的第一個sheet 6 file_path = R"C:\Users\Administrator\python處理Excel數據\20200113\student_list.xlsx" 7 workbook = openpyxl.load_workbook(file_path) 8 sheet_names = workbook.sheetnames 9 sheet1 = workbook[sheet_names[0]] 10 11 # 2. 讀取Excel sheet1中的所有數據 12 sheet1_allDatas = [] 13 for row in sheet1.rows: 14 line = [cell.value for cell in row] 15 sheet1_allDatas.append(line) 16 #print(sheet1_allDatas) 17 18 # 3. 處理數據中姓名這個元素把字符串跟數字區分出來 19 # [1] 第一正則表達式 20 parrten1 = re.compile("[\d]+") #獲取第一個元素的所有數字 21 parrten2 = re.compile("[^\d]+")#獲取第一個元素的所有除數字以外的字符 22 # [2] 通過正則把元素的數字跟字符分離出來,並把處理好的數據添加到新的集合中 23 new_data = [] 24 flg = 0 25 for strs in sheet1_allDatas: 26 flg += 1 27 for i in range(len(strs)): 28 file_data1 = parrten1.findall(strs[0]) 29 file_data2 = parrten2.findall(strs[0]) 30 strs[0] = "".join(file_data2) 31 strs.insert(1, "".join(file_data1)) 32 new_data.append(strs) 33 print(new_data) 34 print("====================================================") 35 # [3] 給title加電話標簽 36 new_data[0].insert(3,"電話") 37 print(new_data) 38 # [4] 除去空格 39 last_Data = [] 40 for lines in new_data: 41 flg +=1 42 for i in range(len(lines)): 43 new_list =[x.strip() for x in lines if x.strip() != ''] 44 last_Data.append(new_list) 45 print(last_Data) 46 47 # [5] 創建新的Excel把結果寫入到Excel中 48 wb = openpyxl.Workbook() 49 ws = workbook.active 50 ws.title = "sheet1" 51 flg = 0 52 for lines in last_Data: 53 flg +=1 54 for i in range(len(lines)): 55 ws.cell(flg,i+1,lines[i]) 56 workbook.save("C:\\Users\\Administrator\\python處理Excel數據\\20200113\\student_list2.xlsx") 57 print("文件保存成功!")
四,重點解釋
1. print(sheet1_allDatas)打印出來的結果如下。到這里只是原封不動的獲取了Excel中原來數據的信息。
[['姓名', '性別', '住址'], ['張飛18273643738', '男', '王者峽谷78號'], ['宮本武藏18734728643', '男', '王者峽谷9號'], ....等
2. 下面這段代碼中的strs代表獲取到sheet1_allDatas中的每一條元素。而file_data1 = parrten1.findall(strs[0])是通過正則表達式查找每一條元素中的第一個元素中的內容進行匹配。file_data1中匹配的是所有數字相反file_data2是file_data1取反數字以外的所有的意思。strs[0] = "".join(file_data2) 和 strs.insert(1, "".join(file_data1))這兩句比較關鍵。第一條把兩個list中的數據合並。第二條是
for strs in sheet1_allDatas:
flg += 1
for i in range(len(strs)):
file_data1 = parrten1.findall(strs[0])
file_data2 = parrten2.findall(strs[0])
strs[0] = "".join(file_data2)
strs.insert(1, "".join(file_data1))
new_data.append(strs)
print(new_data)
結果:[['姓名', '', '', '', '性別', '住址'], ['張飛', '', '', '18273643738', '男', '王者峽谷78號'], ['宮本武藏', '', '', '18734728643', '男', '王者峽谷9號'], ['露娜', '', '', '18883748754', '女', '王者峽谷19號'], ['項羽', '', '', '17693475030', '男', '王者峽谷79號'], ['韓信', '', '', '18832847043', '男', '王者峽谷94號'], ['王昭君', '', '', '1873764204', '女', '王者峽谷75號'], ['劉備', '', '', '17083747453', '男', '王者峽谷54號'], ['阿珂', '', '', '17592934775', '女', '王者峽谷47號'], ['關羽', '', '', '18934664832', '男', '王者峽谷11號'], ['夏侯惇', '', '', '18736735430', '男', '王者峽谷92號'], ['楊玉環', '', '', '18734637923', '女', '王者峽谷76號'], ['成吉思汗', '', '', '18628495937', '男', '王者峽谷80號'], ['安其拉', '', '', '18736459002', '女', '王者峽谷10號'], ['趙雲', '', '', '18736465840', '男', '王者峽谷17號'], ['武則天', '', '', '18964730029', '女', '王者峽谷64號']]
可以看出至少出現兩到三個' ', ' '這種空格。第一段元素為頭部姓名后有3處空格,二內容元素中間有2處空格