正则匹配之 .*?
- 前言
- .*?讲解
- .*?的简单使用
- .*?的爬虫实战
- 目标网页
- 代码分析
- 效果展示
- 结语
前言
正则的知识体系其实是非常庞大的,它可以做规则校验、字符匹配等,且非常强大,速度也非常快,我这里针对字符串匹配作出讲解。通常不同的工作者对正则的使用手法层出不穷,所以我这里推荐一种比较好的方法——(.*?),当然这里需要感谢我大学大数据人工智能课程的任课老师,这种方法也是他在课堂上讲过的。
.*?讲解
.*?是对所有匹配规则的一种集合,又称通配符。通配符,顾名思义是指通用的字符, 用来模糊查找信息,通配符能够代替任意字符。有的学者称这种方法其为惰性匹配,其实我个人也是非常赞成这个名字的。
.*?的简单使用
import re
temp = '清风徐来水波不兴,哪个剧本没有分生,愈想证明就愈不肯定,可能完美和完整'
rule = re.compile('清风徐来(.*?),')
print(re.findall(rule,temp))
如上,我们想获取“水波不兴”,只需要知道它的前后是什么,“水波不兴”使用,*?进行通配,然后给通配加上括号进行选取,若不选取则不加括号。是不是非常简单,好那我们继续看看它在爬虫实战中是如何使用的
.*?的爬虫实战
目标网页
我以爬取链家为例,提取房屋的关键信息。https://dy.lianjia.com/ershoufang/rs/
代码分析
需要注意的是:字符串中有空格、换行符时需要做替换处理,否则.*?会匹配失败。我这里为了解耦,分两次进行匹配。
import requests
import re
res = requests.get('https://dy.lianjia.com/ershoufang/rs/').text
res = res.replace(' ','').replace('\n','')
data = re.findall(re.compile('<ulclass="sellListContent"log-mod="list">(.*?)</ul>'),res)
data = re.findall(re.compile('DATA"href="(.*?)"target.*?alt="(.*?)">.*?data-sl="">(.*?)</a>.*?houseIcon"></span>(.*?)</div>.*?spanclass="">(.*?)</span><i>(.*?)</i>.*?<span>(.*?)</span>'),data[0])
[print(i) for i in data]
效果展示
可以看到,效果是非常不错的。所以呀,赶紧去试试吧!
结语
这里给出我自己的一些经验和使用方法,以上用爬虫举例希望同学们能进一步加深对.*?以及它在数据处理应用中的理解。希望对大家的学习有所帮助