python學習筆記分享(三十五)網絡爬蟲(2)正則表達式

IT Xiao Ang Zai     2019年3月12號

版本:python3.7

編程軟件:Pycharm,Sublime Text 3

 

這裏要介紹的是python的re模塊中正則表達式的語法,其他的暫時不介紹,有興趣的朋友可以自行了解。

 

 

一:正則表達式簡介

在編寫處理字符串的程序的時候,經常需要查找某些複雜規則的字符串。正則表達式通常被用來檢索、替換那些符合某個模式(規則)的文本字符串。用事先定義好的一些特定字符、及這些特定字符的組合,組成一個“字符串模式規則”,匹配這些模式規則對應的字符串。

 

 

二:re模塊

在python中,用re模塊實現正則表達式。re模塊使python語言擁有全部的正則表達式功能。

如果需要重複使用正則表達式,可以先將其編譯成模式對象,用compile()函數。它根據一個模式字符串和可選的標誌參數生成一個正則表達式對象。生成的對象可以用一些方法進行正則表達式和匹配。

re模塊也可以直接引用一些函數實現和正則表達式的方法相同的功能。下面會一一介紹一些常用的正則表達式的內容。

 

 

四:處理函數(常用)

1.re.search()函數

作用:在整個字符串中查找並返回第一個成功的匹配。

格式:re.search(pattern,string,flags=0)

參數說明:

pattern 匹配的正則模式
string 匹配的字符串
flags 編譯標誌位,用於控制正則表達式的匹配方式

返回值:匹配成功返回一個匹配的對象,否者返回None。

獲取正則表達式:可以用group(num)或groups()匹配對象函數獲取匹配表達式。

group(num):一次可以輸入多個組號,根據num匹配對應的值並生成元組,從1開始。

groups():返回一個包含所有子組字符串的元組。

 

2.re.match()函數

作用:如果不是起始位置匹配成功的話,就返回None。

格式:re.match(pattern,string,flags=0)

參數說明:

pattern 匹配的正則模式
string 匹配的字符串
flags 編譯標誌位,用於控制正則表達式的匹配方式

返回值:匹配成功返回一個匹配的對象,否則返回None。

這裏可以發現,它和search()函數類似。但還是有區別:
re.match只匹配開始,如果開始不符合正則模式,就匹配失敗,函數返回None;而re.search匹配整個字符串,只要找到一個匹配符合就算成功。

 

3.正則表達式對象中的search(),match()方法和re.search(),re.match()的區別

先來看一下它們的原型:
 

import re

re.search(pattern,string,flags=0)
p.search(string[,pos[,endpos]])
re.match(pattern,string,flags=0)
p.match(string[,pos[,endpos]])

其實可以看到,正則表達式對象就是把re.search()與re.match()其中的pattern和編譯標誌在用compile()函數生成正則表達式對象時就用了,這裏直接寫string參數把要匹配的字符串添加即可。

其他區別:

(1) re.search()與re.match()返回的是一個匹配的對象,需要使用group()或groups()纔可以獲得匹配的字符串。

(2)正則表達式對象對應的方法可以設置搜索的開始位置和結束位置。

(3)start(),end()和span()分別返回匹配的開始位置,結束位置以及匹配的範圍。

實例:

import re

#re.search()與re.match()
a = "This is my best love thing."
print(re.search("is",a)) #不在開始位置匹配
print(re.search("is",a).span()) #不在開始位置匹配,用span()表示範圍
print(re.search("my",a).group()) #不在開始位置匹配,用group()查找內容
print(re.match("my",a))  #不在開始位置匹配
print(re.match("This",a))  #在開始位置匹配
print(re.match("This",a).start())  #在開始位置匹配,用start()表示開始位置
print(re.match("This",a).end())  #在開始位置匹配,用end()表示結束位置
print(re.match("This",a).span())  #在開始位置匹配,用span()表示範圍
print(re.match("This",a).group())  #在開始位置匹配,用group()查找內容
print(re.match("This",a).group(0))  #在開始位置匹配,用group()查找內容
k = re.compile("This is")
print(k.search(a).group())  #在開始位置匹配,用group()查找內容

結果如下:

4.re.sub()函數

作用:替換字符串中的匹配項。

格式:re.sub(pattern,repl,string,count=0)

參數說明:

pattern 正則中的模式字符串
repl 替換的字符串,也可以爲一個函數
string 要被替換的字符串
count 模式替換後的最大次數,默認0表示替換所有的匹配

返回值:替換後的字符串。

5.compile()函數

作用:編譯正則表達式,生成一個正則表達式模式對象,配合search()和match()函數使用。

格式:re.compile(pattern[,flags])

參數說明:
 

pattern 字符串形式的正則表達式
flags 編譯標誌(匹配模式),可以修改正則表達式的工作方式

flags具體參數爲:
 

標誌 含義
ASCI,A(re.A) 使得轉義字符如 \w, \W, \b, \B, \d, \D, \s, \S只能匹配ASCII字符,僅對Unicode模式有意義
DOTALL,S(re.S) 使得點號(.)匹配任何符號,包括換行符
IGNORECASE,I(re.I) 匹配的時候不區分大小寫
LOCALE,L(re.L) 表示特殊字符集 \w, \W, \b, \B, \s, \S 依賴於當前語言(區域)設置,而不是Unicode數據庫
MULTLINE,M(re.M) 多行匹配,影響^和$,使得^不僅匹配字符串的開頭,還匹配每一行的行首;$不僅匹配字符串的結尾,還匹配每一行的行尾
VERBOSE,X(for 'extended')(re.X) 啓動詳細的正則表達式,忽略空格和'#'後面的註釋,可以使用註釋'#',除了'\#',其它'#'都會被當作註釋

其中re.compile()只是生成一個模式對象,該對象有很多實用方法:

比如search(),match(),sub(),group(),start(),end(),span(),用法和上面的相同。

還有下面幾個方法:

(1)findall()方法

作用:在字符串中找到正則表達式所匹配的所有子串,並返回一個列表,如果沒有找到匹配的,則返回空列表。

格式:findall(string[,pos[,endpos])

參數說明:

string 待匹配的字符串。

pos 可選參數,指定字符串的起始位置,默認爲 0。

endpos 可選參數,指定字符串的結束位置,默認爲字符串的長度。

(2)re.finditer()

作用:在找到正則表達式所匹配的所有子串,並把它們作爲一個迭代器返回。

格式:re.finditer(pattern,string,flags=0)

參數說明:
 

pattern 匹配的正則表達式
string 要匹配的字符串。
flags 編譯標誌位

(3)re.split()

作用:按照能夠匹配的子串將字符串分割後返回列表。

格式:re.split(pattern,string[,maxsplit=0,flags=0])

參數說明:

pattern 匹配的正則表達式
string 要匹配的字符串。
maxsplit 分隔次數,maxsplit=1 分隔一次,默認爲 0,不限制次數。
flags 編譯標誌位

 

三:簡單匹配

1.通配符

正則表達式可以用一個點號(.)表示,可以匹配除了換行符之外的任何字符,如果用compile()生成的模式對象,還可以傳入編譯標誌re.S,使其可以匹配所有字符。

2.反斜槓

反斜槓的用法有兩種,既可以剝奪元字符的特殊能力,又可以讓一些特殊字符擁有一些特殊能力,你如\d就可以匹配數字。

3.字符類

可以用中括號[]將任何內容包起來形成一個字符類,只要匹配這個字符類中的任何字符,就算匹配成功。對於字母來說,是區分大小寫的,可以用編譯標誌re.I改變,或者修改一下。用小斜槓"-"表示範圍。

4.重複匹配

用大括號這對元字符來實現重複匹配的功能,可以有個範圍。

 

四:常用的元字符

由於正則表達式的元字符有很多,下面介紹幾個實際上常用的元字符:
1.點號(.)

點號就是通配符,匹配除了換行符之外的任何字符,如果用compile()生成的模式對象,還可以傳入編譯標誌re.S,使其可以匹配所有字符。

2.脫字符(^)

脫字符表示字符串的開始位置,只有字符串出現在開頭纔會匹配。

3.美元符($)

脫字符表示字符串的結束位置,只有字符串出現在末尾纔會匹配。

4.重複符(*,+,?)

星號(*)相當於{0,}

加號(+)相當於{1,}

問號(?)相當於{0,1}

5.大括號{}

大括號{}用於重複次數。如果前面是一個子組,表示子組的重複次數。也可以表示範圍。

6.中括號[]

中括號是一個字符集合,被其包含的元字符都失去了特殊的功能。可以看成普通的字符。除了一些符號,比如小斜槓(-)表示範圍,反斜槓(\)轉義,脫字符(^)取反。

7.管道符(|)

管道符和邏輯或的功能類似。

8.小括號()

小括號的功能是把裏面的東西變成元組。

9.反斜槓(\)

除了上面說的功能以外,反斜槓如果跟數字在1-99,表示對應的子組所匹配的字符串;如果跟數字是0開頭或三位數字,表示一個八進制數對應的ASCII字符。

 

五:特殊字符

就是反斜槓後面加一些東西后對應的模式字符,下面是常用的:
 

\d 匹配數字。
\D 匹配非數。
\s 匹配空白字符,
\S 匹配非空白字符。
\w 匹配包括下劃線的任何單詞字符。
\W 匹配任何非單詞字符。

 

上面就是正則表達式的基本內容,在之後的文章中就會配合爬蟲進行他們的實例運用。

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