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)是第一个括号中查找的内容...像这样
image.png
比如要匹配字符串是
match:
search,看起来跟match是一样的额,
但是一旦字符串的开头不是匹配字符,match就不能用了
findall
findall
正则表达式在爬虫里用的不多,一般来说,html格式都能用beautiful soup,pyquery之类来解析,json能用json模块来解析,re模块我用的最多的是把返回的json数据中含有其他信息,不好用pandas.read_json读取数据变成dataframe,比如这样的数据:
image.png
就需要re把data后面的数据提取出来。这时用search即可。
有时json结构及其繁琐,想将所有url提取出来,findall也能胜任。
网友评论