『python爬虫』06. 数据解析之re正则解析(保姆级图文)


欢迎关注 『python爬虫』 专栏,持续更新中
欢迎关注 『python爬虫』 专栏,持续更新中

1. 什么是re解析

Regular Expression, 正则表达式, ⼀种使⽤表达式的⽅式对字符串,进⾏匹配的语法规则(按照一定规则的查找)

⽹⻚源代码本质上就是⼀个超⻓的字符串, 用正则就好像是在我们的txt中查找指定内容一样。

正则的优点:速度快, 效率⾼, 准确性⾼
正则的缺点:难度⾼


2. 正则规则

元字符

元字符: 具有固定含义的特殊符号 常⽤元字符

1	.   匹配除换⾏符以外的任意字符
2	\w	匹配字⺟或数字或下划线
3	\s	匹配任意的空⽩符
4	\d	匹配数字
 
5	\n	匹配⼀个换⾏符
6	\t	匹配⼀个制表符
7		
8	^	匹配字符串的开始
9	$	匹配字符串的结尾
10		
11	\W	匹配⾮字⺟或数字或下划线
12	\D	匹配⾮数字
13	\S	匹配⾮空⽩符
14	a|b	匹配字符a或字符b
15	()	匹配括号内的表达式,也表示⼀个组
16	[...]	匹配字符组中的字符
17	[^...]	匹配除了字符组中字符的所有字符

量词

1	*	重复零次或更多次
2	+	重复⼀次或更多次
3	?	重复零次或⼀次
4	{n}	重复n次
5	{n,}	重复n次或更多次
6	{n,m}	重复n到m次

匹配模式测试

符号意义
.*惰性匹配
.*?贪婪匹配

爬⾍⽤的最多的就是这个惰性匹配.,就是尽可能减少所搜索到的目标(搜索会更加精确,用到了回溯的思想)


3. 正则案例

正则在线测试网站:https://tool.oschina.net/regex/

  • 案例1:

待匹配文本:

惰性正则匹配,123456匹配

匹配规则匹配的内容–>惰性(任意一个字符)匹配

惰性.匹配

匹配结果:无匹配项

  • 案例2
    待匹配文本:
惰性正则匹配,123456匹配

匹配规则匹配的内容–>惰性(任意多个个字符)匹配

惰性.*匹配

在这里插入图片描述

  • 案例3
    待匹配文本:
惰性正则匹配,123456匹配

匹配规则匹配的内容–>惰性(任意多个个字符)匹配,要求找到最小范围的匹配项

惰性.*?匹配

原理在于第一步找到了案例2中的 惰性正则匹配,123456匹配字符串之后继续对这个字符串回溯,查看这个字符串中是否能够再找到更小单位的匹配对象,只返回最小长度的匹配对象。
在这里插入图片描述


4. re模块的使用

匹配规则解释: “\d” 表示匹配数字 “+” 表示1个或多个

4.1 findall: 匹配字符串中所有的符合正则的内容

返回值是列表

import re

lst = re.findall(r"\d+", "我的电话号是:10086, 我女朋友的电话是:10010")
# 也就是匹配所有数字串
print(lst)

在这里插入图片描述

4.2 finditer: 匹配字符串中所有的内容[返回的是迭代器]

从迭代器中拿到内容需要.group()

import re

it = re.finditer(r"\d+", "我的电话号是:10086, 我女朋友的电话是:10010")
for i in it:#迭代器for循环输出
    print(i.group())

在这里插入图片描述

4.3 search, 找到一个结果就返回, 返回的结果是match对象

拿数据需要.group(),匹配失败返回None

import re

s = re.search(r"\d+", "我的电话号是:10086, 我女朋友的电话是:10010")
print(s.group())

在这里插入图片描述

4.4 match 从头开始匹配,必须把10086放在待匹配的字符串开头才能匹配成功

真正意义上的从头开始,从待匹配文本的0位字符开始匹配,一般用的不多,功能不如search强大。

import re

s = re.match(r"\d+", "10086, 我女朋友的电话是:10010")
print(s.group())#10086

s = re.match(r"\d+", "我女朋友的电话是:10010,10086")
print(s)#None

在这里插入图片描述

4.5 compile 预加载正则表达式

预先定义一个正则的对象,后面只需要调用对象的方法就好了,不用每次都写一遍正则表达式,节省资源,提高效率

import re

# 预加载正则表达式
obj = re.compile(r"\d+")
#预先定义一个正则的对象,后面只需要调用对象的方法就好了,
# 不用每次都写一遍正则表达式,节省资源,提高效率

ret = obj.finditer("qwer233qwer566")
for it in ret:
    print(it.group())

ret = obj.findall("qwer233qwer899")
print(ret)

4.6 (?P<变量名>匹配规则)

(?P<变量名>匹配规则) 表示把符合这个匹配规则的内容存入对应变量名

import re
obj = re.compile(r"(?P<number>\d+)")# number的值就是匹配得到的数字
ret = obj.finditer("qwer233qwer566")
for it in ret:
    print(it.group("number"))


5. 综合实战

import re

s = """
<div class='jay'><span id='1'>郭麒麟</span></div>
<div class='jj'><span id='2'>宋铁</span></div>
<div class='jolin'><span id='3'>大聪明</span></div>
<div class='sylar'><span id='4'>范思哲</span></div>
<div class='tory'><span id='5'>胡说八道</span></div>
"""

# (?P<分组名字>正则) 可以单独从正则匹配的内容中进一步提取内容
obj = re.compile(r"<div class='.*?'><span id='(?P<id>\d+)'>(?P<name>.*?)</span></div>", re.S)  # re.S: 让.能匹配换行符

result = obj.finditer(s)
for it in result:
    print(it.group("id")+"->"+it.group("name"))

在这里插入图片描述


总结

大家喜欢的话,给个👍,点个关注!给大家分享更多计算机专业学生的求学之路!

版权声明:

发现你走远了@mzh原创作品,转载必须标注原文链接

Copyright 2023 mzh

Crated:2023-3-1

欢迎关注 『python爬虫』 专栏,持续更新中
欢迎关注 『python爬虫』 专栏,持续更新中
『未完待续』


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发现你走远了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值