正則表達式

在自然語言處理任務中,會經常用到正則表達式,在數據預處理部分對數據清洗。提取到“乾淨”的數據用於後續的建模,平時都是用到正則表達式直接查詢,在這裏總結一下正則表達式的內容,方便記憶和查詢。

一、常見的正則表達式

常見的正則表達式大家可以自己找,這裏給一個地址,供大家參考。在python中,re模塊提供了正則表達式的功能。

二、python的re模塊

2.1 正則函數

2.1.1 re.match函數

    函數試圖從字符串的起始部分對模式進行匹配,如果匹配成功,就返回一個匹配對象,如果匹配失敗,就返回None。

    

2.1.2 re.search函數

    函數掃描整個字符串並返回第一個成功的匹配,如果匹配成功re.search方法返回一個匹配的對象,否則返回None。

    

2.1.3  re.sub函數

    函數用於替換字符串中的匹配項。

    re.sub(pattern, repl, string, count=0, flags=0)

    repl參數可以爲替換的字符串,也可以爲一個函數。

          如果repl是字符串,那麼就會去替換字符串匹配的子串,返回替換後的字符串;

          如果repl是函數,定義的函數只能有一個參數(匹配的對象),並返回替換後的字符串。

    

 

    count可指定替換次數,不指定時全部替換。

    

    repl可以爲一個函數。

    

2.1.4 re.subn函數

    和sub函數差不多,但是返回結果不同,返回一個元組“(新字符串,替換次數)

    

2.1.5  re.compile函數

    compile 函數用於編譯正則表達式,生成一個正則表達式( Pattern )對象,供 match() 和 search() 這兩個函數使用。如果匹配成功則返回一個Match對象

2.1.6 findall函數

    在字符串中找到正則表達式所匹配的所有子串,並返回一個列表,如果沒有找到匹配的,則返回空列表

    

2.1.7 re.finditer函數

    在字符串中找到正則表達式所匹配的所有子串,並把它們作爲一個迭代器返回

    

2.1.8  re.split函數

    split 方法用pattern做分隔符切分字符串,分割後返回列表。如果用'(pattern)',那麼分隔符也會返回

    

2.2 re模塊調用

re模塊一共有兩種調用方式:

方法1:

    直接使用上面介紹的 re.match, re.search 和 re.findall 等函數對文本進行匹配查找

方法2:

(1)使用compile 函數將正則表達式的字符串形式編譯爲一個 Pattern 對象;

(2)通過 Pattern 對象提供的一系列方法對文本進行匹配查找,獲得匹配結果(一個 Match 對象);

(3)最後使用 Match 對象提供的屬性和方法獲得信息,根據需要進行其他的操作。

接下來重點介紹compile函數。

    re.compile函數用於編譯正則表達式,生成一個Pattern對象

2.2.1 match函數

    Pattern對象:match(string[, pos[, endpos]])

    其中,string 是待匹配的字符串,pos 和 endpos 是可選參數,指定字符串的起始和終點位置,默認值分別是 0 和 len (字符串長度)。因此,當不指定 pos 和 endpos 時,match 方法默認匹配字符串的頭部。當匹配成功時,返回一個 Match 對象,如果沒有匹配上,則返回 None。

    

    若匹配成功,返回一個match對象。

         group([0, 1, 2,...]): 可返回一個或多個分組匹配的字符串,若要返回匹配的全部字符串,可以使用group()或group(0);

         start(): 匹配的開始位置;

         end(): 匹配的結束位置;

         span(): 包含起始、結束位置的元組。等價於(start(), end());

         groups(): 返回分組信息。等價於(m.group(1), m.group(2));

         groupdict(): 返回命名分組信息。

2.2.2  search函數

    Pattern對象:search(string[, pos[, endpos]])

    

2.2.3  findall函數

    Pattern對象:findall(string[, pos[, endpos]])

    findall 以列表形式返回全部能匹配的子串,如果沒有匹配,則返回一個空列表

    

2.2.4 finditer函數

    Pattern對象:finditer(string[, pos[, endpos]])

    finditer 函數與 findall 類似,但是它返回每一個匹配結果(Match 對象)的迭代器

    

2.2.5 split函數

    Pattern對象:split(string[, maxsplit]])

    maxsplit 可指定分割次數,不指定將對字符串全部分割

   

2.2.6  sub函數

    Pattern對象:sub(repl, string[, count])

    當repl爲字符串時,可以用\id的形式引用分組,但不能使用編號0;當repl爲函數時,返回的字符串中不能再引用分組

    

2.2.7  subn函數

     Pattern對象:subn(repl, string[, count])

     返回一個元組,元組第一個元素和sub函數的結果相同,元組第二個元素返回替換次數

     

2.2.8 兩種方法的畢竟

    未採用compile的方法,每次都編譯,效率低;採用compile只需要編譯一次,效率高。

三、貪婪匹配

    正則表達式匹配時默認的是貪戀匹配,也就是會儘可能多的匹配更多字符。如果想使用非貪戀匹配,可以在正則表達式中加上'?'

    

四、分組

    如果你想要提取子串或是想要重複提取多個字符,那麼你可以選擇用定義分組的形式。用()就可以表示要提取的分組(group)

    正則表達式'(\d{4})-(\d{3, 8})$'表示匹配兩個分組,第一個分組(\d{4})是一個有4個數字的子串,第二個分組(\d{3,8})表示匹配一個數字子串,子串長度爲3到8之間

五、正則表達式修飾符

    re.I     忽略大小寫

    re.L     做本地化識別匹配

    re.M    多行匹配,影響^和$

    re.S     單行,'.'匹配包括換行符在內的所有字符

    re.U     根據Unicode字符集解析字符,影響\w, \W, \b, \B

    re.X     忽略多餘空白符

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章