一只爬虫带你看世界【8】
12. 正则表达式特殊用法及示例(re.findall 方法介绍)
one:利用Re.findall返回单子组:
示例:使用正则表达式爬取贴吧图片(findall用法 - 返回正则表达式中单个子组),说明:采用模块化化编程思想,将打开url封装成一个函数,即open_url(url)。
使用正则表达式匹配图片:
p = r'<imgclass="BDE_Image" src="([^"]+\.jpg)"'
其中[^"]+\.jpg,匹配非双引号的所有字符,并且重复(1,+)次,后缀名为.jpg形式的图片。使用()将需要信息的子组,即直接返回http://www.baidu.com/##/##.jpg而不是整个正则表达式匹配的信息。即imgclass="BDE_Image" src=http://www.baidu.com/##/##.jpg
注意:该情况是正则表达式中只有一个子组
试验 a:未使用正则表达式中的 findall 方法的子组
代码截图如下
返回的结果:
试验b:使用正则表达式中的 findall 方法中单个子组
试验结果:
使用了正则表达式中findall方法的子组后,直接返回图片下载地址,而不是整个img信息。
使用正则表达式爬取IP地址(findall用法-返回正则表达式中多个子组)
two:使用正则表达式爬取IP地址(findall用法-返回正则表达式中多个子组)
上述one中考虑了正则表达式中只有一个子组,two部分则是考虑返回多个子组的情况!
若在正则表达式中使用了多个(),返回多个子组,需要做些处理,使用非捕获组语法
语法:
在正则表达式中,将待返回的子组前加入“?:”则表示非捕获信息
示例如下:
返回的结果:
使用正则表达式匹配ip地址的表达:
p =r'(?:(?:[0,1]?\d?\d|2[0-4]\d|25[0-5])\.){3}(?:[0,1]?\d?\d|2[0-4]\d|25[0-5])'
该正则表达式中有三个子组,确保返回正确的信息,在每个子组前方的左括号后加上?:则正确返回待查询的信息。
总结部分:
在正则表达式中,若返回单个子组,待返回部分使用一对括号;若返回多个子组,待返回部分使用多对括号,并且在每对括号前加上问号和冒号即可!