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

news/2024/7/19 10:11:55 标签: python, 爬虫, 开发语言

目录

    • 1. 什么是re解析
    • 2. 正则规则
      • 元字符
      • 量词
      • 匹配模式测试
    • 3. 正则案例
    • 4. re模块的使用
      • 4.1 findall: 匹配字符串中所有的符合正则的内容
      • 4.2 finditer: 匹配字符串中所有的内容[返回的是迭代器]
      • 4.3 search, 找到一个结果就返回, 返回的结果是match对象
      • 4.4 match 从头开始匹配,必须把10086放在待匹配的字符串开头才能匹配成功
      • 4.5 compile 预加载正则表达式
      • 4.6 (?P<变量名>匹配规则)
    • 5. 综合实战
    • 总结


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

1. 什么是re解析

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

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

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


2. 正则规则

元字符

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

python">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	[^...]	匹配除了字符组中字符的所有字符

量词

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

匹配模式测试

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

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


3. 正则案例

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

  • 案例1:

待匹配文本:

python">惰性正则匹配,123456匹配

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

python">惰性.匹配

匹配结果:无匹配项

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

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

python">惰性.*匹配

在这里插入图片描述

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

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

python">惰性.*?匹配

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


4. re模块的使用

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

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

返回值是列表

python">import re

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

在这里插入图片描述

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

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

python">import re

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

在这里插入图片描述

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

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

python">import re

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

在这里插入图片描述

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

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

python">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 预加载正则表达式

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

python">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<变量名>匹配规则) 表示把符合这个匹配规则的内容存入对应变量名

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


5. 综合实战

python">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爬虫』 专栏,持续更新中
『未完待续』



http://www.niftyadmin.cn/n/279676.html

相关文章

函数(详解)——C语言

Hello&#xff0c;友友们前段时间忙拖更了这么久&#xff0c;趁着五一假期好好卷上一波哈哈哈。好的&#xff0c;我们本期主要对C语言中的函数进行讲解。 1.什么是函数 在数学中也常常用到函数&#xff0c;但你对C语言中的函数有了解吗&#xff1f; 在C语言中函数是一段可重…

3分钟快速了解mysql数据导入到es

可以将 MySQL 中的表数据导入 Elasticsearch 中&#xff0c;并使用中文分词器。在这个例子中&#xff0c;我们将使用 Logstash&#xff08;一个数据处理管道工具&#xff09;将 MySQL 中的数据导入 Elasticsearch。假设您已经安装了 Elasticsearch、Logstash 和 MySQL。 首先&…

回忆我的爷爷

我的爷爷是一个农民&#xff0c;出生于1930年&#xff0c;卒于2000年春天。 从我记事起&#xff0c;就看到他整天忙于农活田耕。炎炎夏日&#xff0c;当我早晨起床下地&#xff0c;他已经扛着锄头从田间回来了&#xff0c;田里永远有干不完的活。栽秧&#xff0c;给稻田放个水…

浅谈大数据领域的云计算

为了快速部署大数据服务&#xff0c;在中小企业中往往采用云计算的方式。自己使用过4年的AWS的大数据云服务&#xff0c;真得好使&#xff0c;开箱即用&#xff0c;除了贵&#xff0c;其他没毛病&#xff0c;尤其在离线计算领域&#xff0c;因为完美符合离线的场景&#xff0c;…

【flask】理解flask的几个难点,难啃的骨头,线程隔离啥的

1.三种路由和各自的比较 2.配置文件所有的字母必须大写 3.if __name__的作用 4.核心对象循环引用的几种解决方式–难 5.Flask的经典错误 6.上下文管理器 7.flask的多线程和线程隔离 三种路由 方法1&#xff1a;装饰器 python C#, java 都可以用这种方式 from flask import F…

【Leetcode -328.奇偶链表 - 725.分隔链表】

Leetcode Leetcode -328.奇偶链表Leetcode - 725.分隔链表 Leetcode -328.奇偶链表 题目&#xff1a;给定单链表的头节点 head &#xff0c;将所有索引为奇数的节点和索引为偶数的节点分别组合在一起&#xff0c;然后返回重新排序的列表。 第一个节点的索引被认为是 奇数 &am…

【地铁上的设计模式】--结构型模式:适配器模式

前面几篇文章我们学习了创建型模式&#xff0c;从本篇文章开始&#xff0c;我们将学习结构型模式。 什么是结构型模式 结构型模式是一种设计模式&#xff0c;它描述了如何将类或对象结合在一起形成更大的结构&#xff0c;以提供新的功能或实现更复杂的行为。结构型模式包括以…

Dart - 爬取Android Studio历史版本信息

文章目录 前言开发环境开发过程1. 遵循robots协议2. 页面结构分析3. Dart项目创建4. Dart项目运行与调试5. 第三库依赖6. 项目完整源码 运行结果最后 前言 整理Android Studio历史版本信息时发现有点多&#xff0c;于是想一劳永逸写一个简单的爬虫抓取一下数据并生成我想要的格…