re模塊中最常用到三個(gè)函數(shù)的是match,search,findall。
不過他們都能匹配字符串,不過又稍有不同。
基本格式
re.findall/match/search("匹配規(guī)則/pattern", "要匹配的字符串")
pattern
我一般用到的情況都是準(zhǔn)長這樣子 開頭內(nèi)容(.星號(hào)?)結(jié)尾內(nèi)容
點(diǎn)代表的是任意字符。星號(hào)代表的是取 0 至 無限長度,問號(hào)代表的是非貪婪模式。
比如要匹配下面字符串中的url
tx ='"pic_middle":"http://wx4.sinaimg.cn/wap360/50a6dcc7ly1fud4g29v0tj22c0340kjl.jpg","pic_big":'
'"pic_middle":"http://wx2.sinaimg.cn/wap360/50a6dcc7ly1fud4g3lbhkj22c02lub29.jpg","pic_big":'
求url地址的pattern就是"pic_middle":(.*?),"pic_big":
非貪婪模式
這是說遇到第一個(gè)結(jié)尾匹配,"pic_big":就結(jié)束了,所以結(jié)果就是http://wx2.sinaimg.cn/wap360/50a6dcc7ly1fud4g3lbhkj22c02lub29.jpg
假如不加?的話,就會(huì)變成我看看后面還有沒有,"pic_big":額,還有呢,那就把所有的內(nèi)容都返回吧,就會(huì)變成這樣。
"http://wx4.sinaimg.cn/wap360/50a6dcc7ly1fud4g29v0tj22c0340kjl.jpg","pic_big":' \ '"pic_middle":"http://wx2.sinaimg.cn/wap360/50a6dcc7ly1fud4g3lbhkj22c02lub29.jpg"
返回結(jié)果
findall返回的是list
match只能找字符串開頭與pattern相匹配的,不一樣就返回None。
search是一旦找到匹配的就返回,不會(huì)去找后來匹配的,都找不到返回None
他們兩個(gè)返回都是object,要得到具體的匹配內(nèi)容,要用group。
group是pattern中的()的個(gè)數(shù),group(0)是所有查找的內(nèi)容,group(1)是第一個(gè)括號(hào)中查找的內(nèi)容,group(2)是第一個(gè)括號(hào)中查找的內(nèi)容...像這樣

比如要匹配字符串是
match:

search,看起來跟match是一樣的額,

但是一旦字符串的開頭不是匹配字符,match就不能用了

findall

正則表達(dá)式在爬蟲里用的不多,一般來說,html格式都能用beautiful soup,pyquery之類來解析,json能用json模塊來解析,re模塊我用的最多的是把返回的json數(shù)據(jù)中含有其他信息,不好用pandas.read_json讀取數(shù)據(jù)變成dataframe,比如這樣的數(shù)據(jù):

就需要re把data后面的數(shù)據(jù)提取出來。這時(shí)用search即可。
有時(shí)json結(jié)構(gòu)及其繁瑣,想將所有url提取出來,findall也能勝任。