關於爬蟲,你需要曉得的正則表達式

日拱一卒|數據挖掘010

入門爬蟲,學習正則表達式並不是必須的,你可以在你真正需要的時候再去學,比如你把數據爬取回來後,需要對數據進行清洗,當你發現使用常規的字符串操作方法根本沒法處理時,這時你可以嘗試瞭解一下正則表達式,往往它能起到事半功倍的效果。Python 的 re 模塊可用來處理正則表達式(Python之禪 劉志軍)。

一、正則表達式簡介

正則表達式是處理字符串的強大工具,擁有自己獨特的語法以及一個獨立的處理引擎.其是對字符串操作的一種邏輯公式,即用事先定義好的一些特定字符、以及這些字符的組合,組成一個“規則字符串”,用來表達對字符串的一種過濾邏輯。

背景知識:字符是計算機軟件處理文字時最基本的單位,可能是字母,數字,標點符號,空格,換行符,漢字等等。字符串是0個或更多個字符的序列。文本也就是文字,字符串。說某個字符串匹配某個正則表達式,通常是指這個字符串裏有一部分(或幾部分分別)能滿足表達式給出的條件

正則表達式可以:

  • 提高網絡爬蟲的效率
  • 提高信息提取的效率
  • 提高網頁運行的效率
  • ...

二、正則表達式用途

比如,正在搜索一個文檔,裏面包含單詞can(不區分大小寫),但並不像把包含字符串can其他單詞(比如American,cancel等)也找出來。

比如,正在編輯一段代碼,需要把其中的size都換成isize,但這種替換需要僅僅限於單詞size而不涉及其他包含字符串size的其他單詞。

比如,創建了一份包含一張表單的Web頁面用來收集用戶信息,其中包含一個電子郵箱地址。需要檢查用戶填寫的地址是否符合正確的語法格式。

以上場景,正則表達式都有用武之地。

正則表達式具有搜索、過濾和替換功能。在使用的過程中需要注意:

  • 正則表達式主要應用於字符串中
  • 字符串編碼問題(UTF-8、GB2312、GBK等)
  • 正則表達式是區分字符串字符大小寫的

三、正則表達式語法

該部分內容參考自:正則表達式完全指南(上)正則表達式完全指南(下)

正則表達式由普通文本字符和特殊字符(元字符)兩種字符組成。元字符在正則表達式中具有特殊意義,它讓正則表達式具有更豐富的表達能力。例如,正則表達式 r"a.d"中 ,字符 ‘a’ 和 ‘d’ 是普通字符,’.’ 是元字符,. 可以指代任意字符,它能匹配 ‘a1d’、’a2d’、’acd’ 。


舉例說明:

如果原文本字符串與正則表達式匹配,那麼就會返回一個 Match 對象,當不匹配時,match 方法返回的 None,通過判斷m是否爲None可進行表單驗證。

(一)元字符

1.基本元字符

. 匹配除換行符以外的任意一個字符,例如:”a.c” 可以完全匹配 “abc”,也可以匹配 “abcef” 中的 “abc”

\ 轉義字符,使特殊字符具有本來的意義,例如: 1.2 可以匹配 1.2

[...] 匹配方括號中的任意一個字符,例如:a[bcd]e 可以匹配 abe、ace、ade。它還支持範圍操作,比如:a到z可表示爲 “[a-z]”,0到9可表示爲 “[0-9]”,注意,在 “[]” 中的特殊字符不再有特殊意義,就是它字面的意義,例如:[.*]就是匹配 . 或者 *
[^...] 字符集取反,表示只要不是括號中出現的字符都可以匹配,例如:a[^bcd]e 可匹配 aee、afe等

group 方法返回原字符串(abcef)中與正則表達式相匹配的那部分子字符串(abc),提前是要匹配成功 match 方法纔會返回 Match 對象,進而纔有group方法。

2.預設元字符

\w 匹配任意一個單詞字符,包括數字和下劃線,它等價於 [A-Za-z0-9_],例如 a\wc 可以匹配 abc、acc

\W 匹配任意一個非單詞字符,與 \w 操作相反,它等價於 [^A-Za-z0-9_],例如: a\Wc 可匹配 a!c

\s 匹配任意一個空白字符,空格、回車等都是空白字符,例如:a\sc 可以配 a\nc,這裏的 \n表示回車

\S 匹配任意一個非空白字符

\d 匹配任意一個數字,它等價於[0-9],例如:a\dc 可匹配 a1c、a2c …

\D 匹配任意一個非數字

(二)匹配

1.邊界匹配

^ 匹配字符的開頭,在字符串的前面,例如:^abc 表示匹配 a開頭,後面緊隨bc的字符串,它可以匹配 abc
$ 匹配字符的結尾,在字符串的末尾位置,例如: hello$

2.重複匹配

* 重複匹配零次或者更多次
? 重複匹配零次或者一次
+ 重複匹配1次或者多次
{n} 重複匹配n次
{n,} 重複匹配至少n次
{n,m} 重複匹配n到m次

(三)邏輯分支

匹配一個固定電話號碼,不同地區規則不一樣,有的地方區號是3位,電話是8位,有的地方區號是4位,電話爲7位,區號與號碼之間用 - 隔開,如果應對這樣的需求呢?這時就需要用到邏輯分支條件字符 |,它把表達式分爲左右兩部分,先嚐試匹配左邊部分,如果匹配成功就不再匹配後面部分了,這是邏輯 “或” 的關係。

(四)分組

前面介紹的匹配規則都是針對單個字符而言的,如果想要重複匹配多個字符怎麼辦,答案是,用子表達式(也叫分組)來表示,分組用小括號”()”表示,例如 (abc){2} 表示匹配abc兩次, 匹配一個IP地址時,可以使用 (\d{1,3}.){3}\d{1,3},因爲IP是由4組數組3個點組成的,所有,前面3組數字和3個點可以作爲一個分組重複3次,最後一部分是一個1到3個數字組成的字符串。如:192.168.0.1。

關於分組,group 方法可用於提取匹配的字符串分組,默認它會把整個表達式的匹配結果當做第0個分組,就是不帶參數的 group() 或者是 group(0),第一組括號中的分組用group(1)獲取,以此類推。

通過分組,我們可以從字符串中提取出想要的信息。另外,分組還可以通過指定名字的方式獲取,語法如圖12。

(五)貪婪與懶惰

當正則表達式中包含能接受重複的限定符時,通常的行爲是(在使整個表達式能得到匹配的前提下)匹配儘可能多的字符。我們稱之爲貪婪模式,是一種貪得無厭的模式。


有時,我們更需要懶惰匹配,也就是匹配儘可能少的字符。前面給出的限定符都可以被轉化爲懶惰匹配模式,只要在它後面加上一個問號?。這樣.*?就意味着匹配任意數量的重複,但是在能使整個匹配成功的前提下使用最少的重複。

Python中re庫放在以後說爬蟲相關庫的時候再介紹啦

參考資料:
1.正則表達式30分鐘入門教程
2.Python爬蟲知識點梳理
3.Python正則表達式指南
4.正則表達式完全指南(上)
5.正則表達式完全指南(下)
6.可能是最好的正則表達式的教程筆記了吧
7.re — 正則表達式操作
8.python 3.6 正則表達式的應用(附實例代碼)
9.棕櫚學院-Python正則表達式公開課

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