python爬蟲之正則表達(dá)
概述
這部分主要講的是python中的re模塊跟磨。
最簡(jiǎn)單的正則表達(dá)就是普通字符串的匹配,即字符串‘a(chǎn)bcd’匹配字符串‘a(chǎn)bcd’。
通配符
正則表達(dá)式可以匹配多個(gè)字符,比如點(diǎn)號(hào) . 可以匹配任何字符,這類統(tǒng)稱通配符涛目。
特殊字符的轉(zhuǎn)義
比如需要匹配“python.org”秸谢,可以使用‘python.org’,但可能會(huì)匹配到別的字符串如"pythonzorg"霹肝,因此需要轉(zhuǎn)義估蹄,即特殊字符前加斜線\,如本例可用'python.org'
字符集
即通過設(shè)定一組字符對(duì)其進(jìn)行匹配沫换,通過中括號(hào)括起來:[a-g] 表示可以匹配到字母表中a-g的任何小寫字符臭蚁,同理也可以將這些字符串一個(gè)接一個(gè)的排列進(jìn)去:[a-zA-Z0-9] 可以匹配到任何數(shù)字和任意大小寫的字母。
反轉(zhuǎn)字符集表示出了這之外的字符都匹配:[^abc]表示匹配除了a b c三個(gè)字符的字符讯赏。
選擇符
若之相匹配某幾個(gè)字符串垮兑,比如"abc"和"abef",可采用選擇特殊字符:'abc|abef'漱挎。
子模式
前述例子也可以采用子模式:'ab(c|ef)'系枪,括號(hào)即子模式。
可選項(xiàng)
在子模式后面積上問號(hào)磕谅,使其變?yōu)榭蛇x項(xiàng)私爷。它可能出現(xiàn)在匹配字符串,但不是必須的膊夹。如字符串:
'(http://)?(www\.)?python\.org'
可以匹配到:
'http://www.python.org'
'http://python.org'
'www.python.org'
'python.org'
重復(fù)子模式
-
(patten)*
允許模式重復(fù)0或多次当犯; -
(patten)+
允許模式重復(fù)1或多次; -
(patten){m,n}
允許模式重復(fù)m到n次割疾。
例如:
'w*\.python\.org'可匹配'www.python.org'或'.python.org'或'wwwwwwwww.python.org'
'w+\.python\.org'可匹配'www.python.org'或'w.python.org'或'wwwwwwwww.python.org'
'w{3.4}\.python\.org'只能匹配'www.python.org'或'wwww.python.org'
re模塊的內(nèi)容
re.compile將正則表達(dá)式轉(zhuǎn)換為模式對(duì)象,可以實(shí)現(xiàn)效率的匹配嘉栓。
re.search會(huì)在給定的字符串中尋找第一個(gè)匹配給正則字符串的子字符串宏榕,返回值是true或者false。
re.math會(huì)在給定字符串的開頭匹配正則表達(dá)式侵佃。因此麻昼,re.math('p','python')返回真,而re.math('p','www.python')則返回假馋辈。
re.split會(huì)根據(jù)模式的匹配項(xiàng)來分割字符串抚芦。
import re
some_text = 'alpha , beta ,,, gama delta'
re.split('[,]+',some_txt)
將返回:
['alpha ','beta ','gama delta ']
re.findall將返回所有匹配到的匹配項(xiàng):
import re
pat = '[a-zA-Z]+'
text = '"Hm...err -- are you sure?" he said, sounding insecure.'
re.findall(pat,text)
will return:
['Hm','err','are','you','sure','he','said','sounding','insecure']
re.sub: 使用給定的替換內(nèi)容將匹配模式的字符串(最左端并且覆蓋子字符串)替換掉:
import re
pat = '{name}'
text = 'Dear {name}...'
re.sub(pat,'Mr. Gumby',text)
will return:
'Dear Mr. Gumby...'
re.escape:可以對(duì)字符串中所有可能被解釋為正則運(yùn)算符的字符進(jìn)行轉(zhuǎn)義的應(yīng)用函數(shù)。
如果字符串很長(zhǎng)且包含很多特殊字符迈螟,而你又不想輸入一大堆反斜線叉抡,可以使用這個(gè)函數(shù):
e.g.
re.escape('www.python.org')
will return:
'www\.python\.org'
re.escape('but where is the ambiguity?')
will return:
'but\ where\ is\ the\ ambiguity\?'
匹配對(duì)象和組
簡(jiǎn)單來說,組就是放置在圓括號(hào)里內(nèi)的子模塊答毫,組的序號(hào)取決于它左側(cè)的括號(hào)數(shù)褥民。組0就是整個(gè)模塊,所以在下面的模式中:
‘There (was a (wee) (cooper)) who (lived in Fyfe)’
包含組有:
0 There was a wee cooper who lived in Fyfe
1 was a wee cooper
2 wee
3 cooper
4 lived in Fyfe
re模塊中匹配對(duì)象和組的函數(shù):
e.g.
import re
m = re.match(r'www\.(.*)\..{3}','www.python.org')
m.group()
will return
m.group(0)
will return
m.group(1)
will return
'python'
m.start(1)
will return:
4
m.end(1)
will return:
10
m.span(1)
will return:
(4,10)
group方法返回模式中與給定組匹配的字符串洗搂,如果沒有組號(hào)消返,默認(rèn)為0 载弄;如上面:m.group()==m.group(0) ;如果給定一個(gè)組號(hào)撵颊,會(huì)返回單個(gè)字符串宇攻。
start 方法返回給定組匹配項(xiàng)的開始索引,
end方法返回給定組匹配項(xiàng)的結(jié)束索引加1倡勇;
span以元組(start逞刷,end)的形式返回給組的開始和結(jié)束位置的索引。