日拱一卒|數據挖掘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正則表達式公開課