Python爬虫学习:Re模块

正则表达式的基本语法

常用元字符

常用量词

在这里插入图片描述

贪婪匹配与惰性匹配

在这里插入图片描述
主要讲一下贪婪匹配和惰性匹配
贪婪匹配的原则就是从头开始,向后匹配直到最后一个匹配项,匹配后返回。
惰性匹配的原则就是从头开始,向后匹配直到第一个匹配项,匹配后返回。
举个例子:

s=re.finditer(r"(小.*游戏)","小明喜欢打游戏,小李喜欢打游戏,小王也喜欢打游戏")
for i in s:
    print(i.group())

结果:
小明喜欢打游戏,小李喜欢打游戏,小王也喜欢打游戏

s=re.finditer(r"(小.*?游戏)","小明喜欢打游戏,小李喜欢打游戏,小王也喜欢打游戏")
for i in s:
    print(i.group())

结果:
小明喜欢打游戏
小李喜欢打游戏
小王也喜欢打游戏

对结果的解释:正则匹配(小.*游戏)的意思是从“小”开始向后匹配,直到最远的“游戏”结束。
正则匹配(小.*?游戏)的意思是从“小”开始向后匹配,直到最远的“游戏”结束。
在系统中,匹配结果有三个:

  1. 小明喜欢打游戏
  2. 小明喜欢打游戏,小李喜欢打游戏
  3. 小明喜欢打游戏,小李喜欢打游戏,小王也喜欢打游戏
    .*匹配选择第三个结果并输出
    .*?选择第一个结果并输出

re模块的一些方法

re.findall

匹配字符串中所有的符合要求的内容。
返回值是列表。

lst=re.findall(r"\d+","我的电话号码是11111,你的电话号码是22222")
print(lst)

结果:[‘11111’, ‘22222’]

re.finditer

匹配字符串中所有符合要求的内容。
返回值是迭代器。

it=re.finditer(r"\d+","我的电话号码是11111,你的电话号码是22222")
for i in it:
    print(i.group())

结果:11111 22222

re.search

从头开始匹配,匹配到第一个符合要求的则返回。
返回值时match对象,从中取数据需要使用.group1方法。

s=re.search(r"\d+","我的电话号码是11111,你的电话号码是22222")
print(s.group())

结果:11111

re.match

以第一个字符为开始,向后匹配。
返回的是match对象,从中取数据需要使用.group1方法。

m=re.match(r"\d+","我的电话号码是11111,你的电话号码是22222")
print(m.group())

这里Python会报错
在这里插入图片描述
显示没有匹配结果。因为match是从“我”开始匹配的,向后没有匹配到数字,返回空值。

改成以下的字符则会显示结果:

m=re.match(r"\d+","11111,你的电话号码是22222")
print(m.group())

结果:11111

re.compile

compile的作用是对正则表达式进行预加载,这样做可以提高之后匹配的效率

obj=re.compile(r"\d+")
s=obj.finditer("我的电话号码是11111,你的电话号码是22222")
for i in s:
    print(i.group())

结果:11111 22222

其他小知识

正则表达式在线测试平台

在开源中国上有一个在线的正则表达式测试平台:https://tool.oschina.net/regex
上面可以输入待匹配的文本和正则表达式,用于测试表达式的正确性。
在这里插入图片描述
网页右侧也给出了一些常用的正则表达式的例子,可以供参考
在这里插入图片描述

给选择的分组起名字

s="<div class='a'><span id='1'>小明</span></div>" \
  "<div class='b'><span id='2'>小王</span></div>" \
  "<div class='c'><span id='3'>小李</span></div>" \
  "<div class='d'><span id='4'>小周</span></div>"

#re.S的作用是让.能匹配换行符
#先加上括号,然后加上 ?P<分组名字>,之后就可以选定从该组中提取数据
obj=re.compile(r"<div class='(?P<rest1>.*?)'>",re.S)
result=obj.finditer(s)
for i in result:
    print(i.group('rest1'),end=' ')

结果:
a b c d
解释:
正则匹配稍显复杂,目的就是提取class,从<div class=’ 开始,向后匹配,每匹配到一个’> 就将结果记录到rest1分组中。
起别名的规则就是在需要起名字的地方先加一个括号(),括号里面加上?P<name>,name表示自己取的名字。
在这个例子中,就是起了rest1名字。
起别名在爬虫中非常实用,当网页源代码很长,而我们想要提取的东西又十分多时,通过给各各分组起名字的方法,将每个分组分类,代码看起来显得很有条理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值