Python個(gè)人學(xué)習(xí)筆記 正則表達(dá)式(二)
非標(biāo)記組
findall()用帶有組的表達(dá)式匹配時(shí),分組匹配的字符會(huì)被標(biāo)記,這會(huì)改變findall()函數(shù)的行為,使得僅會(huì)返回組里面的內(nèi)容,而不是整個(gè)表達(dá)式匹配的字符。
如果想獲取整個(gè)表達(dá)式匹配到的字符串,可以用括號(hào)把整個(gè)表達(dá)式變成一個(gè)組。
但這樣還會(huì)輸出組里面的組的內(nèi)容。
這時(shí)可以在組內(nèi)開頭加上 ?:?阻止組被標(biāo)記,從而創(chuàng)建一個(gè)不被標(biāo)記的組。

貪婪與回溯
正常情況下,正則表達(dá)式的匹配是貪婪的,且被一個(gè)表達(dá)式匹配過的字符不會(huì)再被后面的表達(dá)式匹配。貪婪表示盡可能匹配多的字符。
例如:
\( 匹配一個(gè)左括號(hào),.*會(huì)先直接匹配后面的所有字符 ngm) hhay (nhf)。但這樣 \) 就沒有字符匹配了,應(yīng)該會(huì)輸出False。
這時(shí)候就會(huì)回溯一個(gè)字符讓下一個(gè)表達(dá)式去匹配,如果失敗會(huì)再回溯,盡可能地匹配成功。
回溯后 .* 匹配 ngm) hhay (nhf ,右括號(hào)留給 \),于是返回True。
貪婪與非貪婪(懶惰)
還是上面的例子,貪婪匹配 .* 會(huì)直接匹配整個(gè)字符串。
但如果只想要匹配括號(hào)的內(nèi)容 (ngm)、(nhf),就需要在 *后面加上?實(shí)現(xiàn)非貪婪匹配。
這時(shí)候*匹配到下個(gè)表達(dá)式可匹配的字符后立即停止。
其他量詞的非貪婪模式:
{m}是精準(zhǔn)匹配,所以貪婪與非貪婪沒有區(qū)別,但也不是沒有非貪婪模式。

正向先行斷言與正向后行斷言
有些人打字喜歡在句尾加很多括號(hào),這樣匹配的話也會(huì)把這些括號(hào)也匹配進(jìn)去。
可以用正向先行斷言或正向后行斷言來判斷是不是所要的內(nèi)容。
正向后行斷言 (?<=表達(dá)式)
當(dāng)前位置之前的內(nèi)容符合后行斷言里的表達(dá)式則匹配成功。
正向先行斷言 (?=表達(dá)式)
當(dāng)前位置之后的內(nèi)容符合先行斷言里的表達(dá)式則匹配成功。
負(fù)向先行斷言與負(fù)向后行斷言
負(fù)向先行斷言 (?!表達(dá)式)
當(dāng)前位置之后的內(nèi)容不符合先行斷言里的表達(dá)式則匹配成功。
負(fù)向后行斷言 (?<!表達(dá)式)
當(dāng)前位置之前的內(nèi)容不符合先行斷言里的表達(dá)式則匹配成功。

①斷言里的表達(dá)式既不會(huì)被標(biāo)記也不會(huì)被匹配,只是用來判斷。
②后行斷言中的表達(dá)式必須是固定長(zhǎng)度的。
③多個(gè)斷言可以在同一個(gè)位置同時(shí)使用。

命名組
?P<name>加在括號(hào)內(nèi)、表達(dá)式前,可以給捕獲組命名。
用 group() 索引Match對(duì)象的組時(shí),也可以用組名來索引。
指定組也可以用組名來指定。
但是不能用組名來替換文本。

拆分字符串 re.split()
split()方法的正則表達(dá)式版。相當(dāng)于 replace() 的正則表達(dá)式版是 re.sub() 。
比起 split() 方法,可以一次同時(shí)處理有多種分隔符的情況。
第三個(gè)參數(shù)為可拆分次數(shù),參考 split() 方法。
第四個(gè)參數(shù)為功能標(biāo)志。

