1. 程式人生 > 其它 >import re 資料正則化--筆記總覽

import re 資料正則化--筆記總覽

技術標籤:資料處理正則表示式

正則表示式,可謂是資料處理的神器,我算是見識到了它的威力。之前也接觸過,但一直沒有搞明白。今再次接觸,定要學個明明白白。算有一些入門了,就分享到此處。一是方便日後自己查詢,二是方便小夥伴一起交流學習。日後有更多關於正則化的學習、應用,也將會分享於此。

一:re.findall

在做資料處理的時候,最煩遇到的是一種什麼情況呢?

  1. 資料有規律的儲存了
  2. 然後儲存好的一堆資料,又需要解析出來用
  3. 一組資料裡面各種形形色色的格式

如果是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]]

截圖的樣子如下 ,比這個表格看著直觀些:

可以看出來,這四列都是數字。我這是做目標檢測任務,四列分別是:

  1. 影象名
  2. 標籤0 or 1
  3. 分別疑似度分數
  4. 目標框的座標

後面,我們看看操作過程:(不為什麼目的,就學習資料的正則化)

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文件編輯軟體裡面,就可以直接在上面進行正則化匹配,方便驗證。

後面繼續學習,將繼續分享到這裡。喜歡和感興趣的,歡迎持續關注和收藏,有任何疑問的,可以在下方留言,一起交流。