re模塊中最常用到三個函數的是match,search,findall。
不過他們都能匹配字符串,不過又稍有不同。
基本格式
re.findall/match/search("匹配規則/pattern", "要匹配的字符串")
pattern
我一般用到的情況都是準長這樣子 開頭內容(.星號?)結尾內容
點代表的是任意字符。星號代表的是取 0 至 無限長度,問號代表的是非貪婪模式。
比如要匹配下面字符串中的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":
非貪婪模式
這是說遇到第一個結尾匹配,"pic_big":就結束了,所以結果就是http://wx2.sinaimg.cn/wap360/50a6dcc7ly1fud4g3lbhkj22c02lub29.jpg
假如不加?的話,就會變成我看看后面還有沒有,"pic_big":額,還有呢,那就把所有的內容都返回吧,就會變成這樣。
"http://wx4.sinaimg.cn/wap360/50a6dcc7ly1fud4g29v0tj22c0340kjl.jpg","pic_big":' \ '"pic_middle":"http://wx2.sinaimg.cn/wap360/50a6dcc7ly1fud4g3lbhkj22c02lub29.jpg"
返回結果
findall返回的是list
match只能找字符串開頭與pattern相匹配的,不一樣就返回None。
search是一旦找到匹配的就返回,不會去找后來匹配的,都找不到返回None
他們兩個返回都是object,要得到具體的匹配內容,要用group。
group是pattern中的()的個數,group(0)是所有查找的內容,group(1)是第一個括號中查找的內容,group(2)是第一個括號中查找的內容...像這樣
比如要匹配字符串是
match:
search,看起來跟match是一樣的額,
但是一旦字符串的開頭不是匹配字符,match就不能用了
findall
正則表達式在爬蟲里用的不多,一般來說,html格式都能用beautiful soup,pyquery之類來解析,json能用json模塊來解析,re模塊我用的最多的是把返回的json數據中含有其他信息,不好用pandas.read_json讀取數據變成dataframe,比如這樣的數據:
就需要re把data后面的數據提取出來。這時用search即可。
有時json結構及其繁瑣,想將所有url提取出來,findall也能勝任。