仅供学习,转载请注明出处
python贪婪和非贪婪
Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;
非贪婪则相反,总是尝试匹配尽可能少的字符。
在"*","?","+","{m,n}"后面加上?,使贪婪变成非贪婪。
# 尝试匹配一串数字,至匹配到了一个
In [110]: re.match(r"\d","123456768").group()
Out[110]: '1'
# 增加了 + 号之后,就可以匹配多个了,此时可以算是贪婪模式
In [111]: re.match(r"\d+","123456768").group()
Out[111]: '123456768'
# 那么想要变回非贪婪的话,只要增加一个?号即可
In [112]: re.match(r"\d+?","123456768").group()
Out[112]: '1'
In [113]:
In [113]: re.match(r"\d*","123456768").group()
Out[113]: '123456768'
In [114]: re.match(r"\d*?","123456768").group()
Out[114]: ''
In [115]:
In [119]: re.match(r"\d{1,2}","123456768").group()
Out[119]: '12'
In [120]: re.match(r"\d{1,2}?","123456768").group()
Out[120]: '1'
In [121]:
那么这个非贪婪模式到底有什么实际意义的用法吗?
下面实际应用一下。
斗鱼颜值直播间图片爬取示例
好啦,从页面的元素中,我们找到了一个美女直播的图片元素,这元素里面有两个url地址可以下载图片。
<img alt="小甜幂iu的直播" data-original="https://rpic.douyucdn.cn/live-cover/appCovers/2018/12/06/5582112_20181206194002_small.jpg" src="https://rpic.douyucdn.cn/live-cover/appCovers/2018/12/06/5582112_20181206194002_small.jpg" width="283" height="163" class="JS_listthumb" style="display: block; filter: none;">
匹配如下:
# 首先将内容写入字符串html中
In [121]: html="""
...: <img alt="小甜幂iu的直播" data-original="https://rpic.douyucdn.cn/live-cover
...: /appCovers/2018/12/06/5582112_20181206194002_small.jpg" src="https://rpic.do
...: uyucdn.cn/live-cover/appCovers/2018/12/06/5582112_20181206194002_small.jpg"
...: width="283" height="163" class="JS_listthumb" style="display: block; filter:
...: none;">
...: """
# 使用findall方法,匹配找出http开头的内容
In [122]: re.findall(r"http.*",html)
Out[122]: ['https://rpic.douyucdn.cn/live-cover/appCovers/2018/12/06/5582112_20181206194002_small.jpg" src="https://rpic.douyucdn.cn/live-cover/appCovers/2018/12/06/5582112_20181206194002_small.jpg" width="283" height="163" class="JS_listthumb" style="display: block; filter: none;">']
# 增加匹配jpg结尾的内容,发现还是 .* 的部分匹配了太多内容了,例如把 src= 这类字符串也匹配了进来。
In [128]: re.findall(r"http.*jpg",html)
Out[128]: ['https://rpic.douyucdn.cn/live-cover/appCovers/2018/12/06/5582112_20181206194002_small.jpg" src="https://rpic.douyucdn.cn/live-cover/appCovers/2018/12/06/5582112_20181206194002_small.jpg']
# 此时就要设置未非贪婪,增加?
In [131]: re.findall(r"http.*?jpg",html)
Out[131]:
['https://rpic.douyucdn.cn/live-cover/appCovers/2018/12/06/5582112_20181206194002_small.jpg',
'https://rpic.douyucdn.cn/live-cover/appCovers/2018/12/06/5582112_20181206194002_small.jpg']
In [132]:
# 好了,因为 .* 从原来的贪婪变为非贪婪,那么就只匹配了 http 到 jpg 的这串内容。
# 所以,出来的结果就是图片的url地址了。
关注微信公众号,回复【资料】、Python、PHP、JAVA、web,则可获得Python、PHP、JAVA、前端等视频资料。
网友评论