Python 正则表达式 贪婪匹配和惰性匹配 简单爬虫

我们先梳理下正则表达式知识点

正则表达式:
re模块

import re

re.match()
re.search()
re.findall()
re.sub(pattern,‘新的内容’,str)替换

基础:

. 任意字符
[]范围
| 或者
()一组

量词:

=0
+>=1
? 0,1
{m} =m
{m,}>=m
{m,n} >=m <=n

预定义:

\s space
\S not space
\d digit
\D not digit
\w word [0-9a-zA-Z]
\W not word [^0-9a-zA-Z]

分组


() —>group(1)
number : (\w+)(\d*) ------->group(1) group(2)
引用:( (\w+)(\d*) ) \1 \2 表示引用前面的内容

name
(?P\w+)(?P=name)

贪婪匹配和惰性匹配

Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪),总是尝试匹配尽可能多的字符;非贪婪则相反,总是尝试尽可能稍的字符。
在“*”“?”“+”“{m,n}”后面机上?,是贪婪变成非贪婪。

举例:程序1(贪婪匹配)

import re
#默认是贪婪的
msg = 'abc123abc'
result = re.match(r'abc(\d+)',msg) 
print(result)

结果1

<re.Match object; span=(0, 6), match='abc123'>

分析程序1:结果是abc123,这就是贪婪匹配,其实取到1也是成立的。

程序2
(非贪婪匹配:总是尝试匹配最少的字符。操作:在“*”“?”“+”“{m,n}”后面机上?,是贪婪变成非贪婪。

# 但是我想取到abc1
#操作:在“*”“?”“+”“{m,n}”后面机上?,是贪婪变成非贪婪。
msg = 'abc123abc'
result = re.match(r'abc(\d+?)',msg)
print(result)

结果2

<re.Match object; span=(0, 4), match='abc1'>

接下来我们做一个小练习,试图从贴吧上获取一个图片的路径。
试图获取图片路径
程序1
试着练习匹配到图片的路径

import re
path1 = '<img class="BDE_Image" src="http://tiebapic.baidu.com/forum/w%3D580/sign=1694ca82eb039245a1b5e107b795a4a8/212c7ff082025aaf71554284ecedab64024f1add.jpg" size="560330" changedsize="true" width="560" height="979" style="cursor: url(&quot;//tb2.bdstatic.com/tb/static-pb/img/cur_zin.cur&quot;), pointer;">'
result1 = re.match(r'<img class="BDE_Image" src="(.+)"',path1)
print(result1.group(1))

结果1

http://tiebapic.baidu.com/forum/w%3D580/sign=1694ca82eb039245a1b5e107b795a4a8/212c7ff082025aaf71554284ecedab64024f1add.jpg" size="560330" changedsize="true" width="560" height="979" style="cursor: url(&quot;//tb2.bdstatic.com/tb/static-pb/img/cur_zin.cur&quot;), pointer;

分析结果:我们不仅取到了src ,还取到了其他的信息。

程序2

path2 = '<img class="BDE_Image" src="http://tiebapic.baidu.com/forum/w%3D580/sign=1694ca82eb039245a1b5e107b795a4a8/212c7ff082025aaf71554284ecedab64024f1add.jpg" size="560330" changedsize="true" width="560" height="979" style="cursor: url(&quot;//tb2.bdstatic.com/tb/static-pb/img/cur_zin.cur&quot;), pointer;">'
result2 = re.match(r'<img class="BDE_Image" src="(.*?)"',path2)
print(result2.group(1))
image_path = (result2.group(1))

结果2

http://tiebapic.baidu.com/forum/w%3D580/sign=1694ca82eb039245a1b5e107b795a4a8/212c7ff082025aaf71554284ecedab64024f1add.jpg

分析结果2:我们取到了这个路径

接下来我们获取到这个图片,到当前路径下
程序3

import re
path2 = '<img class="BDE_Image" src="http://tiebapic.baidu.com/forum/w%3D580/sign=1694ca82eb039245a1b5e107b795a4a8/212c7ff082025aaf71554284ecedab64024f1add.jpg" size="560330" changedsize="true" width="560" height="979" style="cursor: url(&quot;//tb2.bdstatic.com/tb/static-pb/img/cur_zin.cur&quot;), pointer;">'
result2 = re.match(r'<img class="BDE_Image" src="(.*?)"',path2)
print(result2.group(1))
image_path = (result2.group(1))

import requests
response = requests.get(image_path)

with open('aa.jpg','wb') as wstream:
    wstream.write(response.content)

结果3:

http://tiebapic.baidu.com/forum/w%3D580/sign=1694ca82eb039245a1b5e107b795a4a8/212c7ff082025aaf71554284ecedab64024f1add.jpg

结果页面展示
结果页面展示
日后爬虫也就是这个思路的,可通过正则,封装好的一些方式进行爬虫。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值