《Python 3網路爬蟲開發實戰》chapter3

又笨又懶的豬發表於2019-07-09

正規表示式

常用的匹配規則

模式描述
\w匹配字母、數字及下劃線
\W匹配不是字母、數字及下劃線的字元
\s匹配任意空白字元,等價於[\t\n\r\f]
\S匹配任意非空字元
\d匹配任意數字,等價於[0-9]
\D匹配任意非數字的字元
\A匹配字串開頭
\Z匹配字串結尾,如果存在換行,只匹配到換行前的結束字串
\z匹配字串結尾,如果存在換行,同時還會匹配換行符
\G匹配最後匹配完成的位置
\n匹配一個換行符
\t匹配一個製表符
^匹配一行字串的開頭
$匹配一行字串的結尾
.匹配任意字元,除了換行符,當re.DOTALL標記被指定時,則可以匹配包括換行符的任意字元
[]用來表示一組字元,單獨列出,比如[amk]匹配a、m或k
[^…]不在[]中的字元,比如[^abc]匹配除了a、b、c之外的字元
*匹配0個或多個表示式
+匹配1個或多個表示式
匹配0個或1個前面的正規表示式定義的片段,非貪婪方式
{n}精確匹配n個前面的表示式
{n,m}匹配n到m次由前面正規表示式定義的片段,貪婪方式
a\b匹配a或b
( )匹配括號內的表示式,也表示一個組

group()與group(1);貪婪匹配與非貪婪匹配

在這裡插入圖片描述

group()會輸出完整的匹配結果,group(n)會輸出第n個被()包圍的匹配結果。

.*是貪婪匹配,會匹配儘可能多的字元。在程式的第6行,.*後面是\d+,也就是至少一個數字,並沒有指定具體多少個數字,因此,.*就儘可能匹配多的字元,這裡就把123456匹配了,給\d+留下一個可滿足條件的數字7,最後得到的內容就只有數字7了。
.*?是非貪婪匹配,在程式的第3行,當.*?匹配到Hello後面的空白字元時,再往後的字元就是數字了,而\d+恰好可以匹配,那麼這裡的.*?就不再進行匹配,交給\d+去匹配後面的數字。所以這樣,.*?匹配了儘可能少的字元,\d+的結果就是1234567了。

在這裡插入圖片描述
需要注意的是,如果匹配的結果在字串結尾,.*?就有可能匹配不到任何內容了,因為它會匹配儘可能少的字元。如上圖所示。

修飾符

修飾符描述
re.I是匹配對大小寫不敏感
re.L使本地化識別(locale-aware)匹配
re.M多行匹配,影響^和$
re.S使.匹配包含換行在內的所有字元
re.U根據Unicode字符集解析字元。這個標誌影響\w、\W、\b和\B
re.X該標誌通過給予你更靈活的格式以便你將正規表示式寫的更易於理解

例:

result = re.match('^He.*?(\d+).*?Demo$', content, re.S)

轉義匹配

在這裡插入圖片描述

re.match()方法是從字串的開頭開始匹配的,一旦開頭不匹配,那麼整個匹配就失敗了。
re.search()方法,它在匹配時會燒苗整個字串,然後返回第一個成功匹配的結果。如果沒有符合規則的字串,就返回None。
re.findall()方法,該方法會搜尋整個字串,然後返回匹配正規表示式的所有內容。
re.sub()方法:

比如,想要把一串文字的所有數字都去掉,可以藉助sub()方法。
只需要給第一個引數傳入\d+來匹配所有的數字,第二個引數為替換成的字串(如果去掉該引數的話,可以複製為空),第三個引數是原字串。
在這裡插入圖片描述

re.compile()方法可以將正則字串編譯成正規表示式物件,以便在後面的匹配中複用。此外,compile()中還可以傳入修飾符,例如re.S等修飾符,這樣在search()、findall()等方法中就不需要額外傳了。

相關文章