python爬蟲學習筆記4-正規表示式

藏狐發表於2020-12-12

1.簡介

1.1概念

正規表示式是對字串操作的一種邏輯公式,就是用事先定義好的一些特定字元、及這些特定字元的組合,
組成一個“規則字串”,這個“規則字串”用來表達對字串的一種過濾邏輯。

1.2 應用場景

  • 表單驗證(eg:手機號、郵箱、身份證…)
  • 爬蟲

2.正規表示式對python的支援

在python中自帶正規表示式庫re,下面使用re庫中match()函式進行正規表示式的匹配。

2.1 re簡單應用

import re

'''
match(pattern, string, flags=0)
第一個pattern 正規表示式 如果匹配成功 返回一個match物件 如果匹配失敗返回一個None
第二個string  表示要匹配的字串
第三個flags=0 標緻位 用於控制正規表示式的匹配方式 如 是否區分大小寫 是否換行匹配
'''
pattern = 'pythonn' # 正規表示式
s = 'pythonn and java' # 要匹配的字串
result = re.match(pattern,s) 

if result:
    print(result.group())# 匹配到的字串
    print(result.start())# 開始索引
    print(result.end()) # 結束索引
    print(result.span()) # 索引元組(開始索引,結束索引)
else:
    # print(result)
    print('沒有匹配到資料')

2.2 re庫的主要方法

方法描述
match (pattern,string,[,flags])從起始位置開始查詢,一次匹配 。
search(pattern,string,[,flags])從任何位置開始查詢,一次匹配 。
findall(pattern,string,flags)全部匹配,返回列表 。
split(pattern,string[,maxsplit=0,flags]分割字串,返回列表
sub(pat,repl,string,[,count=0,flags])替換 。
compile(pattern,string,[,flags])用來編譯正規表示式模式字串,並生成 Regular Expression Objects。

image-20201212213258961

image-20201212213334146

3.正規表示式語法

構造正規表示式的方法和建立數學表示式的方法一樣。也就是用多種元字元與運算子可以將小的表示式結合在一起來建立更大的表示式。正規表示式的元件可以是單個的字元、字符集合、字元範圍、字元間的選擇或者所有這些元件的任意組合。

正規表示式是由普通字元(例如字元 a 到 z)以及特殊字元(稱為"元字元")組成的文字模式。模式描述在搜尋文字時要匹配的一個或多個字串。正規表示式作為一個模板,將某個字元模式與所搜尋的字串進行匹配。

3.1 普通字元

“普通字元”:字母、數字、漢字、下劃線及沒有特殊定義的符號。

正規表示式中的普通字元在匹配時只匹配與自身相同的一個字元。
eg:

pattern =  'c' # 正規表示式
str = 'abcde' # 待匹配字元
# 匹配成功,匹配的內容就是'abcd'中的'c',下標是2

3.2 元字元

除普通字元外的特殊字元(稱為"元字元")。

3.2.1 限定符

限定符用來指定正規表示式的一個給定元件必須要出現多少次才能滿足匹配,用於重複匹配。

字元描述
*匹配前面的子表示式零次或多次。
+匹配前面的子表示式一次或多次。
?匹配前面的子表示式零次或一次。
{n}n 是一個非負整數。匹配確定的n次。
{n,}n 是一個非負整數。至少匹配n次。
{m,n}最少匹配m次且最多匹配n次。

image-20201212201312622

3.2.2 定位符

定位符使您能夠將正規表示式固定到行首或行尾。定位符用來描述字串或單詞的邊界,
正規表示式的定位符有:

字元描述
^匹配輸入字串開始的位置。如果設定了 RegExp 物件的 Multiline 屬性,^ 還會與 \n 或 \r 之後的位置匹配。
$匹配輸入字串結尾的位置。如果設定了 RegExp 物件的 Multiline 屬性,$ 還會與 \n 或 \r 之前的位置匹配。
\b匹配一個單詞邊界,即字與空格間的位置。
\B非單詞邊界匹配。

3.2.3 特殊字元

許多元字元要求在試圖匹配它們時特別對待。下表列出了正規表示式中的特殊字元:

字元描述
.匹配除換行符 \n 之外的任何單字元。要匹配 . ,請使用 \.
|指明兩項之間的一個選擇。
[]匹配字符集中的一個
[^]字符集的反操作,^必須在[]裡的最前面。
-定義[]裡的一個區間,eg[a-z]
\將下一個字元標記為或特殊字元、或原義字元、或向後引用、或八進位制轉義符。例如, ‘n’ 匹配字元 ‘n’。’\n’ 匹配換行符。序列 ‘\’ 匹配 “”,而 ‘(’ 則匹配 “(”。
()對錶達式進行分組,將圓括號內的內容當作一個整體,並獲得匹配的值。

image-20201212205025083

image-20201212205201637

image-20201212205304158

image-20201212205444159

image-20201212205531332

一些無法書寫【非列印字元】或者具有特殊功能的字元,若要匹配這些特殊字元,必須首先使字元"轉義",即,將反斜槓字元\ 放在它們前面。

字元描述
\cx匹配由x指明的控制字元。例如,\cM 匹配一個 Control-M 或回車符。x 的值必須為 A-Z 或 a-z 之一。否則,將 c 視為一個原義的 ‘c’ 字元。
\f匹配一個換頁符。等價於 \x0c\cL
\n匹配一個換行符。等價於 \x0a\cJ
\r匹配一個回車符。等價於 \x0d\cM
\s匹配任何空白字元,包括空格、製表符、換頁符等等。等價於 [ \f\n\r\t\v]。注意 Unicode 正規表示式會匹配全形空格符。
\S匹配任何非空白字元。等價於 [^ \f\n\r\t\v]
\t匹配一個製表符。等價於 \x09\cI
\v匹配一個垂直製表符。等價於 \x0b\cK

image-20201212205613993

image-20201212205713025

3.2.4 預定義匹配字符集

正規表示式的一些表示方法,可以同時匹配某個預定義字符集中的任意一個字元。

字元描述
\d任意一個數字,0-9中的任意一個
\w任意一個字母或數字或下劃線,即A-Z、a-z、0-9、_中的任意一個
\s空格、製表符、換頁符等空白字元中的任意一個
\D\d的反集
\W\w的反集
\S\s的反集

image-20201212210735687

image-20201212210816189

3.3. 貪婪模式和非貪婪模式

  • 貪婪:嘗試匹配儘可能多的字元
  • 非貪婪:嘗試匹配儘可能少的字元
  • 和 + 限定符都是貪婪的,因為它們會盡可能多的匹配文字,只有在它們的後面加上一個 ? 就可以實現非貪婪或最小匹配。

貪婪:下面的表示式匹配從開始小於符號 (<) 到關閉 h1 標記的大於符號 (>) 之間的所有內容。

/<.*>/

非貪婪:如果您只需要匹配開始和結束 h1 標籤,下面的非貪婪表示式只匹配

/<.*?>/

相關文章