正規表示式
正規表示式(或 RE)是一種小型的、高度專業化的程式語言,(在Python中)它內嵌在Python中,並通過 re 模組實現,所以使用時要匯入re模組。正規表示式模式被編譯成一系列的位元組碼,然後由用 C 編寫的匹配引擎執行。
先說幾個元字元 . ^ $ * + ? { }
import re ret = re.findall(`t...r`, `hellotomorrow`) print(ret) # [`tomor`] ret = re.findall(`^r.w`, `r1whellotomorr2w`) print(ret) # [`r1w`] ret = re.findall(`r.w$`, `r1whellotomorr2w`) print(ret) # [`r2w`] ret = re.findall(`hello$`, `r1whellotomorr2w`) print(ret) # [`awwwn`] ret = re.findall(`abc*`, `abcccc`) # 貪婪匹配[0,+oo] print(ret) # [`abcccc`] ret = re.findall(`abc*`, `ab`) # 貪婪匹配[0,+oo] print(ret) # [`ab`] ret = re.findall(`abc+`, `abccc`) # [1,+oo] print(ret) # [`abccc`] ret = re.findall(`abc?`, `abccc`) # [0,1] print(ret) # [`abc`] ret = re.findall(`abc{1,4}`, `abccc`) print(ret) # [`abccc`] 貪婪匹配 ret=re.findall(`abc*?`,`abcccccc`) print(ret)#[`ab`] 當* + ?的後面再加上?的話就會變成惰性匹配
元字元:[ ]
import re ret = re.findall(`a[bc]d`,`abd`) print(ret)#[`abd`],選b或c ret = re.findall(`[a-z]`,`abd`) print(ret)#[`a`, `b`, `d`],選出a到z的元素 ret = re.findall(`[.*+]`,`a.b+c*`) print(ret)#[`.`, `+`, `*`],消除某些元字元的特殊功能 ret = re.findall(`[1-9]`,`adc51ca`) print(ret)#[`5`, `1`],選出1到9之間的數字 ret = re.findall(`[^ab]`,`jnan21b`) print(ret)#[`j`, `n`, `n`, `2`, `1`],選出除了a,b的元素 ret = re.findall(`dc`,`123 cad#4`) print(ret)#[`1`, `2`, `3`, `4`],選出數字
元字元的轉義符
反斜槓後邊跟元字元去除特殊功能,比如.
反斜槓後邊跟普通字元實現特殊功能,比如d
d 匹配任何十進位制數;它相當於類 [0-9]。
D 匹配任何非數字字元;它相當於類 [^0-9]。
s 匹配任何空白字元;它相當於類 [
fv]。
S 匹配任何非空白字元;它相當於類 [^
fv]。
w 匹配任何字母數字字元;它相當於類 [a-zA-Z0-9_]。
W 匹配任何非字母數字字元;它相當於類 [^a-zA-Z0-9_]
匹配一個特殊字元邊界,比如空格 ,&,#等
有一種特殊情況:
import re m = re.findall(`blow`, `blow`) print(m)#[] m = re.findall(`\bblow`, `blow`) print(m)#[`blow`] m = re.findall(r`blow`, `blow`) print(m)#[`blow`]
這是因為在python直譯器中“\”才相當於一個“”,而光寫一個“”是不能被識別的。
元字元( )分組
ret = re.search(`(?P<id>d{3})/(?P<name>w{2,3})`, `233/cn`) print(ret.group())#233/cn print(ret.group(`id`))#233
這段程式碼的意思是以‘/’為界限分為名為id(3個數字)和名為name(2個或3個字母)的兩個組,其中(?P<XXX>)是固定的格式,但可以不用這種格式。如果沒有用這種格式則沒有辦法按名字來訪問組中的資料,按需求來選擇是否要用。而search()是掃描整個string查詢匹配,會掃描整個字串並返回第一個成功的匹配。
re.compile()
compile()可以編譯正規表示式模式,返回一個物件。可以把常用的正規表示式編譯成正規表示式物件,方便後續呼叫及提高效率。
import re ret = re.compile(`(d{3})/(w{2,3})`) print(ret.search(`233/cn`).group())
#233/cn
re.match()
只檢測是不是在string的開始位置匹配,若在開頭檢測不到,則返回空。
ret = re.match(`233`,`2334567`) print(ret) #<re.Match object; span=(0, 3), match=`233`> #可以通過ret.span()檢視其終止點,通過ret.group()檢視匹配到的內容。
re.search()
掃描整個string查詢匹配,會掃描整個字串並返回第一個成功的匹配.
import re ret = re.compile(`(d{3})/(w{2,3})`) print(ret.search(`233/cn`).group()) #233/cn,也可以像match那樣用span和group
re.split()
原型是re.split(pattern, string, maxsplit=0)
通過正規表示式將字串分離。如果用括號將正規表示式括起來,那麼匹配的字串也會被列入到list中返回。maxsplit是分離的次數,maxsplit=1分離一次,預設為0,不限制次數。
import re ret = re.split(`s`,`adsnjfsnja`) print(ret) #[`ad`, `njf`, `nja`]
re.sub()
替換目標字串中的部分內容,格式為sub(`要匹配的型別`,`替換的內容`,`目標字串`,`替換次數`)
import re ret = re.sub(`d`,`abc`,`1bd,2fg`) print(ret)#abcbd,abcfg ret = re.sub(`d`,`abc`,`1bd,2fg`,1) print(ret)#abcbd,2fg
re.finditer()
把匹配到的內容放到一個迭代器中,返回一個迭代器物件。
import re ret = re.finditer(`d`,`a1b2c3,4`) print(ret)#<callable_iterator object at 0x0000021C112E8240> print(next(ret).group())#1