【乾貨】python正則表達式應用筆記

【乾貨】python正則表達式應用筆記

來自專欄 深度學習自然語言處理

來自微信公眾號 深度學習自然語言處理

背景

回老家了,繼續更新。今天重新看了看文本清洗的代碼,發現有一個正則表達式木有看懂,應該是之前學過的現在也印象太模糊了,就網上搜索,最終找到了一個乾貨----莫煩 python正則表達式講解視頻。如下

正則表達式 (Regular Expression) 又稱 RegEx, 是用來匹配字元的一種工具. 在一大串字元中尋找你需要的內容. 它常被用在很多方面, 比如網頁爬蟲, 文稿整理, 數據篩選等等. 最簡單的一個例子, 比如我需要爬取網頁中每一頁的標題. 而網頁中的標題常常是這種形式.

<title>我是標題</ title>

而且每個網頁的標題各不相同, 我就能使用正則表達式, 用一種簡單的匹配方法, 一次性選取出成千上萬網頁的標題信息. 正則表達式絕對不是一天就能學會和記住的, 因為表達式裡面的內容非常多, 強烈建議, 現在這個階段, 你只需要了解正則里都有些什麼, 不用記住, 等到你真正需要用到它的時候, 再反過頭來, 好好琢磨琢磨, 那個時候才是你需要訓練自己記住這些表達式的時候.

簡單匹配

正則表達式無非就是在做這麼一件事。在文字中找到特定的內容。我們在「dog runs to cat」 這句話中尋找存在「cat」 或者 「bird」 。

但是正則表達式絕非不止這些簡單的匹配,它還能做更加高級的內容。要使用正則表達式,首先需要調用一個python的內置模塊 re 。然後我們重複上面的步驟,不過這次使用正則。可以看出,如果 re.search() 找到了結果,它會返回一個match 的 object 。如果沒有匹配到,它會返回 None 。這個re.search() 只是 re 中的一個功能,之後會介紹其他功能。

靈活匹配

除了上面的簡單匹配,下面的內容才是正則的核心內容,使用特殊的 pattern 來靈活匹配需要找的文字。

如果需要找到潛在的多個可能性文字,我們可以使用 [ ] 將可能的字元囊括進來。比如 [ ab ]就說明我想要找的字元可以是 a 也可以是 b 。這裡我們還需要注意的是,建立一個正則的規則,我們在 pattern 的 "" 前面需要加上一個 r 用來表示這是正則表達式,而不是普通字元串。通過下面這種形式,如果字元串中出現 "run" 或者 "ran" , 它都能找到 。

同樣,中括弧 [ ] 中還可以是一下這些或者是這些的組合。比如 [ A-Z ] 表示的就是所有大寫的英文字母。 [ 0-9a-z ] 表示可以是數字也可以使任何小寫字母。

按類型匹配

除了自己定義的規則,還有很多匹配的規則時提前就給我們定義好了的。下面有一些特殊的匹配類型給大家總結一下,然後再上一些例子。

  • d : 任何數字
  • D : 不是數字
  • s : 任何 white space, 如 [

    fv]

  • S : 不是 white space
  • w : 任何大小寫字母, 數字和 「」 [a-zA-Z0-9]
  • W : 不是 w
  •  : 空白字元 (在某個字的開頭或結尾)
  • B : 空白字元 (在某個字的開頭或結尾)
  • \ : 匹配
  • . : 匹配任何字元 (除了
    )
  • ^ : 匹配開頭
  • $ : 匹配結尾
  • ? : 前面的字元可有可無

下面就是具體的舉例說明。

如果一個字元串有很多行,我們想使用 ^ 形式來匹配行開頭的字元,如果通常的形式是不成功的。比如下面的 " | " 出現在第二行,這時候,我們要使用另一個參數,讓 re.search() 可以對每一個單獨處理。這個參數就是 flags = re.M ,或者這樣寫也行 flags.re.MULTILINE 。

重複匹配

如果我們想讓某個規律被重複使用,在正則裡面也是可以實現的,而且實現的方式還有很多。具體可以分為這三種:

  • * : 重複零次或多次
  • + : 重複一次或多次
  • {n, m} : 重複 n 至 m 次
  • {n} : 重複 n 次

舉例如下:

分組

我們甚至可以為找到的內容分組,使用 ( ) 能輕鬆實現這件事。通過分組,我們能輕鬆定位所找到的內容。比如這個 ( d+ ) 組裡,需要找到的是一些數字,在 ( .+ ) 這個組裡,我們會找到 " Date: "後面的所有內容。當使用 match.group( ) 時,它會返回所有組裡的內容,而如果給.group(2) 里加了一個數,它就能定位你需要返回哪個組裡的信息。

有時候,組會很多,光用數字可能比較難找到自己想要的組,這時候,如果有一個名字當索引,會是一件很容易的事。我們需要在括弧的開頭寫上這樣的形式 ?P<名字> 就給這個組定義一個名字。然後就能用這個名字找到這個組的內容。

findall

前面我們說的都是只找到最開始匹配上的一項而已,如果需要找到全部的匹配項,我們可以使用 findall 功能。然後返回一個列表。注意下面還有一個新的知識點, | 是 or 的意思,要不是前者要不是後者。

replace

我們還能通過正則表達式匹配上一些形式的字元串然後再替換掉這些字元串。使用這種匹配 re.sub( ) ,將比python自帶的string.replace( ) 要靈活的多。

split

再來我們python中有個字元串的分割功能,是split,比如" a is b".split(" "),這樣它就會產生一個列表來保存所有單詞。但是在正則中,這種普通的分割也可以做的淋漓盡致。

compile

最後我們還能使用 compile 過後的正則,來對這個正則重複使用。先將正則 compile 進一個變數,比如 compiled_re ,然後直接使用這個 compiled_re 來搜索。

小抄


參考資料:morvanzhou.github.io


推薦閱讀:

RabbitMQ學習心得——遠程過程調用(RPC)
利用函數計算實現網路遊戲或視頻直播中的敏感詞檢測
66頁PPT堪破生活中的數據思維,讓你數據科學之路666
為什麼說浮點數缺乏精確性? python中浮點數運算問題
如何批量獲取年報中數據?

TAG:Python | 乾貨 | 正則表達式 |