當(dāng)我們已經(jīng)獲取到一個(gè)完整的頁面HTML內(nèi)容時(shí)乡恕,如何從這些雜亂的內(nèi)容中鎖定并提取出我們所需要的內(nèi)容那昧甘?這就要用到一個(gè)十分強(qiáng)大的工具:正則表達(dá)式喜爷。
1?初識正則表達(dá)式
正則表達(dá)式是對字符串操作的一種邏輯公式澜沟,就是用事先定義好的一些特定字符撬槽、及這些特定字符的組合,組成一個(gè)“規(guī)則字符串”恤煞,這個(gè)“規(guī)則字符串”用來表達(dá)對字符串的一種過濾邏輯屎勘。
正則表達(dá)式并不是Python的一部分。正則表達(dá)式是用于處理字符串的強(qiáng)大工具居扒,擁有自己獨(dú)特的語法以及一個(gè)獨(dú)立的處理引擎概漱,效率上可能不如str自帶的方法,但功能十分強(qiáng)大喜喂。得益于這一點(diǎn)瓤摧,在提供了正則表達(dá)式的語言里,正則表達(dá)式的語法都是一樣的玉吁,區(qū)別只在于不同的編程語言實(shí)現(xiàn)支持的語法數(shù)量不同照弥;但不用擔(dān)心,不被支持的語法通常是不常用的部分进副。如果已經(jīng)在其他語言里使用過正則表達(dá)式这揣,只需要簡單看一看就可以上手了。
正則表達(dá)式的大致匹配過程是:1.依次拿出表達(dá)式和文本中的字符比較,2.如果每一個(gè)字符都能匹配给赞,則匹配成功机打;一旦有匹配不成功的字符則匹配失敗。3.如果表達(dá)式中有量詞或邊界塞俱,這個(gè)過程會(huì)稍微有一些不同姐帚。
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個(gè)反斜杠”\\\\”:前兩個(gè)和后兩個(gè)分別用于在編程語言里轉(zhuǎn)義成反斜杠畅厢,轉(zhuǎn)換成兩個(gè)反斜杠后再在正則表達(dá)式里轉(zhuǎn)義成一個(gè)反斜杠。
Python里的原生字符串很好地解決了這個(gè)問題氮昧,這個(gè)例子中的正則表達(dá)式可以使用r”\\”表示框杜。同樣,匹配一個(gè)數(shù)字的”\\d”可以寫成r”\d”袖肥。有了原生字符串咪辱,表達(dá)式也更加直觀了。