Python爬蟲 正規表示式(re模組)

2021-10-17 08:25:59 字數 4799 閱讀 3503

正規表示式是通過特殊的字串行,實現字串的檢索、替換、匹配驗證。在爬蟲時,使用正規表示式便於我們快速提取到html中的資訊。

**說明

.

匹配除換行符(\n)以外的任意字元。當re.dotall標記被制定時,則可以匹配任意字元

匹配字串的開頭

匹配字串的結尾

匹配[ ]中列舉的字元

匹配不在[ ]中列舉的字元

匹配0個或多個的表示式

匹配1個或多個表示式

匹配0個或1個前面的正規表示式定義的片段,非貪婪方式

精確匹配n個前面的表示式

匹配n到m次由前面正規表示式定義的片段,貪婪方式

a|b匹配 a 或 b

匹配括號內的表示式,也表示乙個組

\w匹配字母或數字或下劃線或漢字0-9、a-z、a-z、_(下劃線)、漢字和其他國家的語言符號

\w匹配非字母或數字或下劃線或漢字,跟\w正好相反

\s匹配任意的空白符,如 /t、/n、/r、/f

\s匹配任意非空白符

\d匹配任意數字 = [0,9]

\d匹配任意非數字的字元

\b匹配單詞的開頭或結尾

\a匹配字串開頭

\z匹配字串結尾,若存在換行,只匹配到換行符前的結束字元

\z匹配字串結尾,若存在換行,同時還會匹配換行符

\g匹配最後匹配完成的位置

\n匹配乙個換行符

\t匹配乙個製表符

嘗試從字串的起始位置匹配乙個模式,如果不是起始位置匹配成功的話,match()就返回none。

re.match(pattern, string, flags=0)

# pattern:匹配的正規表示式

# string:要匹配的字串

# flags:標誌位,用於控制正規表示式的匹配方式,如:是否區分大小寫,多行匹配等

可以使用group(num) 或 groups() 匹配物件函式來獲取匹配表示式:

匹配物件方法

描述group(num=0)

匹配的整個表示式的字串,group() 可以一次輸入多個組號,在這種情況下它將返回乙個包含那些組所對應值的元組。

groups()

返回乙個包含所有小組字串的元組,從 1 到 所含的小組號。

eg.

import re

line = "cats are smarter than dogs"

matchobj = re.match( r'(.*) are (.*?) .*', line, re.m|re.i)

if matchobj:

print "matchobj.group() : ", matchobj.group()

print "matchobj.group(1) : ", matchobj.group(1)

print "matchobj.group(2) : ", matchobj.group(2)

else:

print "no match!!"

輸出:

matchobj.group() :  cats are smarter than dogs

matchobj.group(1) : cats

matchobj.group(2) : smarter

compile 函式用於編譯正規表示式,生成乙個正規表示式( pattern )物件,供 match() 和 search() 這兩個函式使用。

re.compile(pattern[, flags])
引數:

pattern : 乙個字串形式的正規表示式

flags : 可選,表示匹配模式,比如忽略大小寫,多行模式等,具體引數為:

1.re.i忽略大小寫

2.re.l表示特殊字符集 \w, \w, \b, \b, \s, \s 依賴於當前環境

3.re.m多行模式

4.re.s即為.,並且包括換行符在內的任意字元(.不包括換行符)

5.re.u表示特殊字符集 \w, \w, \b, \b, \d, \d, \s, \s 依賴於 unicode 字元屬性資料庫

6.re.x為了增加可讀性,忽略空格和 # 後面的注釋

eg.

import re

pattern = re.compile(r'\d+') # 用於匹配至少乙個數字

m = pattern.match('one12twothree34four') # 查詢頭部,沒有匹配

print m

# none

m = pattern.match('one12twothree34four', 2, 10) # 從'e'的位置開始匹配,沒有匹配

print m

#none

m = pattern.match('one12twothree34four', 3, 10) # 從'1'的位置開始匹配,正好匹配

print m # 返回乙個 match 物件

#<_sre.sre_match object at 0x10a42aac0>

m.group(0) # 可省略 0

#'12'

m.start(0) # 可省略 0

#3m.end(0) # 可省略 0

#5m.span(0) # 可省略 0

#(3, 5)

掃瞄整個字串並返回第乙個成功的匹配,否則返回none。

re.search(pattern, string, flags=0)

eg.

import re

print(re.search('www', 'www.runoob.com').span()) # 在起始位置匹配

print(re.search('com', 'www.runoob.com').span()) # 不在起始位置匹配

輸出:

(0, 3)

(11, 14)

re.match()與re.search()的區別:re.match()只匹配字串的開始,如果字串開始不符合正規表示式,則匹配失敗,函式返回none;而re.search()匹配整個字串,直到找到乙個匹配。

用於替換字串中的匹配項。

re.sub(pattern, repl, string, count=0, flags=0)

# pattern:匹配的正規表示式

# repl:替換的字串,也可為乙個函式

# string:要匹配的字串

# count:模式匹配後替換的最大次數,預設0表示替換所有的匹配

eg.

import re

phone = "2004-959-559 # 這是乙個國外**號碼"

# 刪除字串中的 python注釋

num = re.sub(r'#.*$', "", phone)

print("**號碼是: ", num)

# 刪除非數字(-)的字串

num = re.sub(r'\d', "", phone)

print("**號碼是 : ", num)

輸出:

**號碼是:  2004-959-559 

**號碼是 : 2004959559

re.findall(pattern, string, flags=0)
對 string 返回乙個不重複的 pattern 的匹配列表, string 從左到右進行掃瞄,匹配按找到的順序返回。如果樣式裡存在一到多個組,就返回乙個組合列表;就是乙個元組的列表(如果樣式裡有超過乙個組合的話)。空匹配也會包含在結果裡。

re.findall(pattern, string, flags=0)
用 pattern 分開 string 。 如果在 pattern 中捕獲到括號,那麼所有的組裡的文字也會包含在列表裡。如果 maxsplit 非零, 最多進行 maxsplit 次分隔, 剩下的字元全部返回到列表的最後乙個元素。

eg.

re.split(r'\w+', 'words, words, words.')

# 列印結果:['words', 'words', 'words', '']

re.split(r'(\w+)', 'words, words, words.')

# 列印結果:['words', ', ', 'words', ', ', 'words', '.', '']

re.split(r'\w+', 'words, words, words.', 1)

# 列印結果:['words', 'words, words.']

re.split('[a-f]+', '0a3b9', flags=re.ignorecase)

# 列印結果:['0', '3', '9']

待續......

[1] 《python3網路爬蟲開發實戰》

[2]   

python 正規表示式 re

match 和 search 的區別 match是從字串開頭匹配,而search是在整個字串中匹配。如 p re.compile a z p.match message none 因為開頭是 因此無法匹配 而 m p.search message print m re.matchobject ins...

python正規表示式 re

re.match 嘗試從字串的開始匹配乙個模式,如 下面的例子匹配第乙個單詞。import retext jgood is a handsome boy,he is cool,clever,and so on.m re.match r w s text ifm print m.group 0 n m...

python正規表示式(re)

在python中re模組用於對正規表示式 regular expression 的支援。正規表示式是可以匹配文字片段的模式。一 正規表示式的書寫 1 萬用字元 點 可以匹配任何字元 除了換行符 如 ike 可以匹配 bike like 等 2 對特殊字元進行轉義 在正規表示式中如果是引用特殊字元作為...