當(dāng)我們已經(jīng)獲取到一個完整的頁面HTML內(nèi)容時,如何從這些雜亂的內(nèi)容中鎖定并提取出我們所需要的內(nèi)容那?這就要用到一個十分強(qiáng)大的工具:正則表達(dá)式。
1?初識正則表達(dá)式
正則表達(dá)式是對字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規(guī)則字符串”,這個“規(guī)則字符串”用來表達(dá)對字符串的一種過濾邏輯。
正則表達(dá)式并不是Python的一部分。正則表達(dá)式是用于處理字符串的強(qiáng)大工具,擁有自己獨特的語法以及一個獨立的處理引擎,效率上可能不如str自帶的方法,但功能十分強(qiáng)大。得益于這一點,在提供了正則表達(dá)式的語言里,正則表達(dá)式的語法都是一樣的,區(qū)別只在于不同的編程語言實現(xiàn)支持的語法數(shù)量不同;但不用擔(dān)心,不被支持的語法通常是不常用的部分。如果已經(jīng)在其他語言里使用過正則表達(dá)式,只需要簡單看一看就可以上手了。
正則表達(dá)式的大致匹配過程是:1.依次拿出表達(dá)式和文本中的字符比較,2.如果每一個字符都能匹配,則匹配成功;一旦有匹配不成功的字符則匹配失敗。3.如果表達(dá)式中有量詞或邊界,這個過程會稍微有一些不同。
2?正則表達(dá)式規(guī)則
下面是Python語言中正則表達(dá)式的元字符和匹配語法:
3?數(shù)量詞的貪婪模式與非貪婪模式
正則表達(dá)式通常用于在文本中查找匹配的字符串。Python里數(shù)量詞默認(rèn)是貪婪的(在少數(shù)語言里也可能是默認(rèn)非貪婪),總是嘗試匹配盡可能多的字符;非貪婪的則相反,總是嘗試匹配盡可能少的字符。例如:正則表達(dá)式”ab*”如果用于查找”abbbc”,將找到”abbb”。而如果使用非貪婪的數(shù)量詞”ab*?”,將找到”a”。
注:我們一般使用非貪婪模式來提取網(wǎng)頁內(nèi)容。
4?反斜杠問題
與大多數(shù)編程語言相同,正則表達(dá)式里使用”\”作為轉(zhuǎn)義字符,這就可能造成反斜杠困擾。假如你需要匹配文本中的字符”\”,那么使用編程語言表示的正則表達(dá)式里將需要4個反斜杠”\\\\”:前兩個和后兩個分別用于在編程語言里轉(zhuǎn)義成反斜杠,轉(zhuǎn)換成兩個反斜杠后再在正則表達(dá)式里轉(zhuǎn)義成一個反斜杠。
Python里的原生字符串很好地解決了這個問題,這個例子中的正則表達(dá)式可以使用r”\\”表示。同樣,匹配一個數(shù)字的”\\d”可以寫成r”\d”。有了原生字符串,表達(dá)式也更加直觀了。