import re 資料正則化--筆記總覽
正則表示式,可謂是資料處理的神器,我算是見識到了它的威力。之前也接觸過,但一直沒有搞明白。今再次接觸,定要學個明明白白。算有一些入門了,就分享到此處。一是方便日後自己查詢,二是方便小夥伴一起交流學習。日後有更多關於正則化的學習、應用,也將會分享於此。
一:re.findall
在做資料處理的時候,最煩遇到的是一種什麼情況呢?
- 資料有規律的儲存了
- 然後儲存好的一堆資料,又需要解析出來用
- 一組資料裡面各種形形色色的格式
如果是CSV檔案,讀取出來的,都當做字串。要想取個什麼東西,就要按照字串的處理方式,較為繁瑣。但是,正則化就顯得尤為的簡單,但是,需要找到資料中的一般規律,然後取出來就較為的簡單了。
本小節主要知識點如下:
1.re.findall在字串中返回正則表示式所匹配的的所有子串,並返回一個列表。如果一個都沒有匹配上,則返回空列表
2.\d 匹配字串中的數字
3.* 重複0次或更多次 例如:35.26 35+.+26 [0-9]+.+[0-9]
4.真.需加\,即\.;當然,要查詢\本身,你也得用\\
下面,就用一個案例,來將上面四點,做個實踐。上面4點看不懂的不要緊,下面的案例包你看明白,為你初入正則化,做開門解惑。
今有一張資料統計表,資料儲存為CSV格式,資料共四列,內容如下:
ddaae641bf2af78c1a02ba43575b0d51_3001_2849_0.1440486666667_0.1440486666667.png | [0] | [0.6761001944541931] | [[273.28466796875, 175.67626953125, 402.2430419921875, 328.661865234375]] |
2.25.136083661060415706315254052090742684427_4000_3000_0_0.png | [0, 0] | [0.7710305452346802, 0.5624949932098389] | [[190.70089721679688, 38.103851318359375, 450.9465637207031, 446.1026916503906], [615.7803955078125, 33.51222229003906, 808.9849853515625, 279.001953125]] |
2.25.325405860827049753751982304033775186562_3370_3214_0_0.png | [0, 0, 0] | [0.8847285509109497, 0.7925058603286743, 0.5061626434326172] | [[61.759857177734375, 317.8360595703125, 316.9251708984375, 758.53271484375], [119.5316162109375, 86.29457092285156, 465.26458740234375, 359.308349609375], [676.3946533203125, 208.73971557617188, 899.0660400390625, 524.486328125]] |
截圖的樣子如下 ,比這個表格看著直觀些:
可以看出來,這四列都是數字。我這是做目標檢測任務,四列分別是:
- 影象名
- 標籤0 or 1
- 分別疑似度分數
- 目標框的座標
後面,我們看看操作過程:(不為什麼目的,就學習資料的正則化)
import pandas as pd
import re
import numpy as np
my_csv_path = r'tb.csv'
content = pd.read_csv(my_csv_path, delimiter=',', header=None, index_col=False)
name = content[0].values # 第一列,檔名
pcls = content[1].values # 第二列,類別
scores = content[2].values # 第三列,分數
bbox = content[3].values # 第四列,座標
# re.findall在字串中返回正則表示式所匹配的的所有子串,並返回一個列表。如果一個都沒有匹配上,則返回空列表。
# \d 匹配字串中的數字
# * 重複0次或更多次 例如:35.26 35+.+26 [0-9]+.+[0-9] 真.需加\,即\.
def cls2list(i):
print("i:", i)
# \d 匹配數字 [0, 0]
cls_str = re.findall("(\d)",i)
print("cls_str:", cls_str)
cls_list = [float(i) for i in cls_str]
print("cls_list:", cls_list)
print("cls_list.type:", type(cls_list))
return cls_list
def score2list(i):
# \d 匹配數字,真.需加\,即\.
# 例如:[0.7710305452346802, 0.5624949932098389] 0 + . + 7710305452346802
print("i:", i)
score_str = re.findall("(\d*\.\d*)",i)
print("score_str:", score_str)
score_list = [float(i) for i in score_str]
print("score_list:", score_list)
print("score_list.type:", type(score_list))
return score_list
def box2list(i):
"""
:param i: 一張圖片中文字型別的box xmin,ymin,xmax,ymax
:return: 二維陣列描述框
"""
print(i)
# [0-9] 匹配字串中的所有數字
# * 重複0次或更多次 例如:35.26 35+.+26 [0-9]+.+[0-9] 真.需加\,即\.
box_str = re.findall("([0-9]*\.[0-9]*)", i)
print("box_str:", box_str)
box_list =[float(i) for i in box_str]
print("box_list:", box_list)
print("box_list.type:", type(box_list))
return box_list
for i in range(2):
name_i = name[i]
cls_i = pcls[i]
scores_i = scores[i]
bboxes_i = bbox[i]
print(name_i, cls_i, scores_i, bboxes_i)
print(type(name_i), type(cls_i), type(scores_i), type(bboxes_i))
# 1.對cls做資料正則化 [0, 0]
cls_i_list = cls2list(cls_i)
print("\n")
# 2.對score做資料正則化 ['0.7710305452346802', '0.5624949932098389']
score_i_list = score2list(scores_i)
print("\n")
# 3.對bbox做資料正則化
# [[190.70089721679688, 38.103851318359375, 450.9465637207031, 446.1026916503906],
# [615.7803955078125, 33.51222229003906, 808.9849853515625, 279.001953125]]
bbox_i_list = box2list(bboxes_i)
print("\n")
列印的結果顯示如下:
ddaae641bf2af78c1a02ba43575b0d51_3001_2849_0.1440486666667_0.1440486666667.png [0] [0.6761001944541931] [[273.28466796875, 175.67626953125, 402.2430419921875, 328.661865234375]]
<class 'str'> <class 'str'> <class 'str'> <class 'str'>
i: [0]
cls_str: ['0']
cls_list: [0.0]
cls_list.type: <class 'list'>
i: [0.6761001944541931]
score_str: ['0.6761001944541931']
score_list: [0.6761001944541931]
score_list.type: <class 'list'>
[[273.28466796875, 175.67626953125, 402.2430419921875, 328.661865234375]]
box_str: ['273.28466796875', '175.67626953125', '402.2430419921875', '328.661865234375']
box_list: [273.28466796875, 175.67626953125, 402.2430419921875, 328.661865234375]
box_list.type: <class 'list'>
2.25.136083661060415706315254052090742684427_4000_3000_0_0.png [0, 0] [0.7710305452346802, 0.5624949932098389] [[190.70089721679688, 38.103851318359375, 450.9465637207031, 446.1026916503906], [615.7803955078125, 33.51222229003906, 808.9849853515625, 279.001953125]]
<class 'str'> <class 'str'> <class 'str'> <class 'str'>
i: [0, 0]
cls_str: ['0', '0']
cls_list: [0.0, 0.0]
cls_list.type: <class 'list'>
i: [0.7710305452346802, 0.5624949932098389]
score_str: ['0.7710305452346802', '0.5624949932098389']
score_list: [0.7710305452346802, 0.5624949932098389]
score_list.type: <class 'list'>
[[190.70089721679688, 38.103851318359375, 450.9465637207031, 446.1026916503906], [615.7803955078125, 33.51222229003906, 808.9849853515625, 279.001953125]]
box_str: ['190.70089721679688', '38.103851318359375', '450.9465637207031', '446.1026916503906', '615.7803955078125', '33.51222229003906', '808.9849853515625', '279.001953125']
box_list: [190.70089721679688, 38.103851318359375, 450.9465637207031, 446.1026916503906, 615.7803955078125, 33.51222229003906, 808.9849853515625, 279.001953125]
box_list.type: <class 'list'>
看明白上面程式碼裡面的註釋了嗎?思路和過程都列印了出來。
re.findall 在字串中返回正則表示式所匹配的的所有子串,並返回一個列表。如果一個都沒有匹配上,則返回空列表。
1.類, [0, 0],單個的數字,用 \d 來做數字匹配。就可以全取出來了,正則表示式為:(\d)
2.分數,[0.984,0.765],拆分來看,是由數字和.(點)組成的,通俗點就是:0 + . + 984,正則表示式為:(\d*\.\d*)
3.座標框,[[273.28466796875, 175.67626953125, 402.2430419921875, 328.661865234375]],拆分來看,是由273 + . +28466796875,正則表示式為:([0-9]*\.[0-9]*),[0-9] 表示匹配字串中的0-9所有數字,*為多次,\. 就表示為.,後面重複
這就是正則表示式的入門,為有些明白正則表示式其中的內涵了。emeditor文件編輯軟體裡面,就可以直接在上面進行正則化匹配,方便驗證。
後面繼續學習,將繼續分享到這裡。喜歡和感興趣的,歡迎持續關注和收藏,有任何疑問的,可以在下方留言,一起交流。