正規表示式是通過特殊的字串行,實現字串的檢索、替換、匹配驗證。在爬蟲時,使用正規表示式便於我們快速提取到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 對特殊字元進行轉義 在正規表示式中如果是引用特殊字元作為...