1?re模塊
Python通過re模塊提供對正則表達(dá)式的支持,使用re的一般步驟是先將正則表達(dá)式的字符串形式編譯為Pattern實例,然后使用Pattern實例處理文本并獲得匹配結(jié)果(一個Match實例),最后使用Match實例獲得信息,進(jìn)行其他的操作。
還是直接上代碼:
上述代碼的輸出結(jié)果為:hello。
Pattern不能直接實例化,必須使用re.compile()進(jìn)行構(gòu)造。Pattern對象是一個編譯好的正則表達(dá)式,通過Pattern提供的一系列方法可以對文本進(jìn)行匹配查找。pattern也可以理解為一個匹配模式。
接下來講解一下Match對象,Match對象是一次匹配的結(jié)果,包含了很多關(guān)于此次匹配的信息,可以使用Match提供的可讀屬性或方法來獲取這些信息。
屬性:
string:?匹配時使用的文本。
re:?匹配時使用的Pattern對象。
pos:?文本中正則表達(dá)式開始搜索的索引。值與Pattern.match()和Pattern.seach()方法的同名參數(shù)相同。
endpos:?文本中正則表達(dá)式結(jié)束搜索的索引。值與Pattern.match()和Pattern.seach()方法的同名參數(shù)相同。
lastindex:?最后一個被捕獲的分組在文本中的索引。如果沒有被捕獲的分組,將為None。
lastgroup:?最后一個被捕獲的分組的別名。如果這個分組沒有別名或者沒有被捕獲的分組,將為None。?
方法:
group([group1,?…]):?獲得一個或多個分組截獲的字符串;指定多個參數(shù)時將以元組形式返回。group1可以使用編號也可以使用別名;編號0代表整個匹配的子串;不填寫參數(shù)時,返回group(0);沒有截獲字符串的組返回None;截獲了多次的組返回最后一次截獲的子串。
groups([default]):?以元組形式返回全部分組截獲的字符串。相當(dāng)于調(diào)用group(1,2,…last)。default表示沒有截獲字符串的組以這個值替代,默認(rèn)為None。
groupdict([default]):?返回以有別名的組的別名為鍵、以該組截獲的子串為值的字典,沒有別名的組不包含在內(nèi)。default含義同上。
2?re.compile(string[,flag])
此方法是通過第一個參數(shù)傳入正則表達(dá)式的原生字符串,就可以編譯生成pattern對象,還有另一參數(shù)flag是匹配模式,取值可以使用位運(yùn)算符“|”來表示同時生效,具體的選值及其含義如下:
re.I(全拼:IGNORECASE):?忽略大小寫(括號內(nèi)是完整寫法,下同)
re.M(全拼:MULTILINE):?多行模式,改變'^'和'$'的行為
re.S(全拼:DOTALL):?點(diǎn)任意匹配模式,改變'.'的行為
re.L(全拼:LOCALE):?使預(yù)定字符類?\w?\W?\b?\B?\s?\S?取決于當(dāng)前區(qū)域設(shè)定
re.U(全拼:UNICODE):?使預(yù)定字符類?\w?\W?\b?\B?\s?\S?\d?\D?取決于unicode定義的字符屬性
re.X(全拼:VERBOSE):?詳細(xì)模式。這個模式下正則表達(dá)式可以是多行,忽略空白字符,并可以加入注釋。
3?re.match(pattern,?string[,?flags])
這個方法將會從string的開頭開始,嘗試匹配pattern,一直向后匹配,如果遇到無法匹配的字符,立即返回None,如果匹配未結(jié)束已經(jīng)到達(dá)string的末尾,也會返回None。兩個結(jié)果均表示匹配失敗,否則匹配pattern成功,同時匹配終止,不再對string向后匹配。
方法使用參考代碼如下:?
輸出為:hello
4 re.search(pattern,?string[,?flags])
search方法與match方法極其類似,區(qū)別在于match()函數(shù)只檢測re是不是在string的開始位置匹配,search()會掃描整個string查找匹配,match()只有在0位置匹配成功的話才有返回,如果不是開始位置匹配成功的話,match()就返回None。同樣,search方法的返回對象同樣match()返回對象的方法和屬性。
方法使用參考代碼如下:
輸出為:world
5?re.split(pattern,?string[,?maxsplit])
按照能夠匹配的子串將string分割后返回列表。maxsplit用于指定最大分割次數(shù),不指定將全部分割。
方法使用參考代碼如下:
輸出為:['one',?'two',?'three']
6?re.findall(pattern,?string[,?flags])
搜索string,以列表形式返回全部能匹配的子串。
方法使用參考代碼如下:
輸出為:['1',?'2']
7?Re模塊的另一種使用方法
上面諸如match、search等方法的調(diào)用,還可以通過pattern.match和pattern.search方法來完成,這樣就避免了將pattern作為第一個參數(shù)傳入啦,到底用那種方法,看個人的習(xí)慣就好。