项目五:学会如何使用python爬虫解析库(小白小成级)

前言

在上一篇我们学习了re模块的使用方法和了解正则表达式的基本语法规则,那么这一次还继续在学习一下re模块的函数用法,毕竟要想短时间内学会爬虫,基本功一定要扎实。这样面对日益更新的技术我们能够从容应对。

当然忘了可以看一下下面的链接文章,希望能给你带来一些好的灵感。

项目四:学会如何使用python爬虫解析库(小白小成级)-CSDN博客

上一篇我们学会简单应用re.match()re.search()的两个方法,这一次我们要学一下三个个函数的用法,分别是re.sub()re.findall()re.finditer()

re.sub()
简介

re.sub() 是 Python re 模块中的一个函数,用于替换字符串中与正则表达式模式匹配的部分。这个函数可以在整个字符串中查找所有匹配的子串,并将它们替换为指定的文本。

代码用法

import re

new_string = re.sub(pattern, repl, string, count=0, flags=0)

代码解释

  • pattern:正则表达式模式,用于匹配字符串中的文本。
  • repl:替换文本,可以是一个字符串或者一个函数。如果是函数,它将接收匹配对象作为参数,并返回用于替换的字符串。
  • string:要处理的原始字符串。
  • count:可选参数,指定替换的最大次数。默认为 0,表示替换所有匹配项。
  • flags:可选参数,用于修改正则表达式的行为,如忽略大小写等。
案例

替换文本

import re

# 定义一个正则表达式模式,匹配数字
pattern = r'\d+'

# 定义替换文本
repl = 'NUMBER'

# 原始字符串,包含多个数字
text = "There are 123 apples and 456 oranges."

# 使用 re.sub() 替换所有数字
new_text = re.sub(pattern, repl, text)

# 输出替换后的字符串
print(new_text)  # 输出: "There are NUMBER apples and NUMBER oranges."

输出结果

在这个例子中,re.sub() 函数将字符串 text 中的所有数字(123456)替换为 "NUMBER"

re.findall()
简介

re.findall() 是 Python re 模块中的一个函数,用于查找字符串中所有与正则表达式模式匹配的子串。这个函数返回一个列表,包含了所有匹配的非重叠子串。

代码用法

import re

matches = re.findall(pattern, string, flags=0)

代码解释

  • pattern:正则表达式模式,用于定义要查找的内容。
  • string:要搜索的原始字符串。
  • flags:可选参数,用于修改正则表达式的行为,如忽略大小写(re.IGNORECASE)等。
案例

查找邮件

import re

# 定义一个正则表达式模式,匹配电子邮件地址
pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'

# 原始字符串,包含多个电子邮件地址
text = "Contact us at info@example.com or support@moonshot.cn for more information."

# 使用 re.findall() 查找所有匹配的电子邮件地址
email_addresses = re.findall(pattern, text)

# 输出匹配结果
print(email_addresses)  # 输出: ['info@example.com', 'support@moonshot.cn']

在这个例子中re.findall() 函数查找 text 字符串中所有匹配正则表达式 pattern 的电子邮件地址,并将它们作为一个列表返回。这个列表包含了所有找到的电子邮件地址。

提示:re.findall() 是文本处理中非常有用的功能,它可以帮助你从文本中提取特定的信息,如电话号码、URL、日期等。通过使用不同的正则表达式模式,你可以执行各种复杂的文本提取任务。

小贴士:Contact us at info@example.com or support@moonshot.cn for more information.可以翻译为”如需了解更多信息,请通过 info@example.com 或 support@moonshot.cn 与我们联系。“这个通常出现在网站、应用程序或文档的底部或联系信息部分,提供用户联系的电子邮件地址。

输出结果

可以看到输出结果成功返回一个列表,这个列表包含着邮箱地址。

re.finditer()
简介

re.finditer() 是 Python re 模块中的一个函数,它用于在字符串中查找所有与正则表达式模式匹配的子串,并返回一个迭代器,每个迭代项都是一个匹配对象(Match对象)。这些匹配对象包含了关于每个匹配的详细信息,如匹配的文本、位置等。

代码用法

import re

matches = re.finditer(pattern, string, flags=0)

代码解释

  • pattern:正则表达式模式,用于定义要查找的内容。
  • string:要搜索的原始字符串。
  • flags:可选参数,用于修改正则表达式的行为,如忽略大小写(re.IGNORECASE)等。
案例

迭代对象

import re

pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
text = "Contact us at info@example.com or support@moonshot.cn for more information."
matches = re.finditer(pattern, text)

for match in matches:
    print("匹配的电子邮件地址:", match.group())
    print("匹配的起始位置:", match.start())
    print("匹配的结束位置:", match.end())
    print("匹配的字符串:", match.group(0))
    print("匹配的原始字符串中的位置:", match.span())
    byte_position = len(text[:match.start()].encode('utf-8')) # 计算字节位置
    print("匹配的字符串的字节位置:", byte_position)

输出结果

在这个例子中,re.finditer() 函数查找 text 字符串中所有匹配正则表达式 pattern 的电子邮件地址,并将它们作为匹配对象的迭代器返回。通过遍历这个迭代器,我们可以获取每个匹配的详细信息,包括匹配的文本、起始和结束位置等。

re.finditer() 是一个非常有用的函数,特别是当你需要对每个匹配项进行更复杂的处理时。它允许你访问匹配对象的所有属性和方法,从而提供了比 re.findall() 更丰富的信息。

提示:

byte_position = len(text[:match.start()].encode('utf-8'))

这行代码看起来有点吓人,但没事我们坚信车到山前必有路,船到桥头自然直的人生理念

首先,让我们从内部往外看这行代码:

  • text[:match.start()]: 这部分代码使用切片操作,从原始文本中提取出与当前匹配之前的部分。
  • .encode('utf-8'): 接着,对这个部分文本进行 UTF-8 编码,将文本编码为字节序列。
  • len(): 最后,使用 len() 函数计算这个字节序列的长度,也就是匹配之前的文本在 UTF-8 编码中占用的字节数。

因此,byte_position 的目的是计算当前匹配之前的文本在 UTF-8 编码中占用的字节数,从而确定当前匹配的字节位置。

虽然这行代码可能看起来有些复杂,但它的目的是为了获取匹配的起始位置在原始文本的字节级别的位置。

总结

分析一下re模块中三个常用的函数re.sub()re.findall()re.finditer()的区别

re模块中的 re.sub()re.findall()re.finditer() 函数都是用于处理正则表达式的匹配,但它们各自有不同的用途和返回值:

1.re.sub(pattern, repl, string, count=0, flags=0)

  • 用途:替换字符串中与正则表达式模式匹配的部分。可以替换所有匹配项,或者指定最大替换次数。
  • 返回值:返回一个新的字符串,其中所有匹配的模式都被替换为 repl 指定的文本
  • 特点:
    • repl 可以是一个字符串,也可以是一个函数,用于动态生成替换文本。
    • count 参数控制替换的最大次数。
    • 通常用于需要在字符串中修改或删除匹配文本的场景。

2.re.findall(pattern, string, flags=0)

  • 用途:查找字符串中所有与正则表达式模式匹配的子串。
  • 返回值:返回一个列表,包含了所有匹配的子串。
  • 特点:
    • 通常用于提取字符串中的特定模式。
    • 返回的是匹配的文本列表,而不是匹配对象。

3.re.finditer(pattern, string, flags=0)

  • 用途:查找字符串中所有与正则表达式模式匹配的子串,并获取更详细的匹配信息。
  • 返回值:返回一个迭代器,每个迭代项都是一个 Match 对象。
  • 特点:
    • Match 对象包含了匹配的详细信息,如匹配的文本、起始和结束索引等。
    • 通常用于需要对每个匹配项进行复杂处理或分析的场景。

综上所知,得出如下

  • re.sub() 用于替换,返回修改后的字符串。
  • re.findall() 用于查找所有匹配项,返回匹配文本的列表。
  • re.finditer() 用于查找所有匹配项,并提供每个匹配的详细信息,返回 Match 对象的迭代器。

根据不同的具体需求,可以选择最合适的函数来处理正则表达式匹配。

如果需要修改原始字符串,使用 re.sub()

如果需要提取匹配的文本列表,使用 re.findall()

如果需要访问每个匹配的详细信息,使用 re.finditer()

好了,今日分享到此一游,我是好运,想要好运,关注我点赞不迷路,一起成长

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/551969.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用SpringBoot将中国地震台网数据保存PostGIS数据库实践

目录 前言 一、数据转换 1、Json转JavaBean 2、JavaBean与数据库字段映射 二、空间数据表设计 1、表结构设计 三、PostGIS数据保存 1、Mapper接口定义 2、Service逻辑层实现 3、数据入库 4、运行实例及结果 总结 前言 在上一篇博客中基于Java的XxlCrawler网络信息爬…

ActiveMQ 07 集群配置

Active MQ 07 集群配置 官方文档 http://activemq.apache.org/clustering 主备集群 http://activemq.apache.org/masterslave.html Master Slave TypeRequirementsProsConsShared File System Master SlaveA shared file system such as a SANRun as many slaves as requ…

leetcode:739.每日温度/496.下一个更大元素

单调栈的应用: 求解当前元素右边比该元素大的第一个元素(左右、大小都可以)。 单调栈的构成: 单调栈里存储数组的下标; 单调栈里的元素递增,求解当前元素右边比该元素大的第一个元素;元素递…

Python继承

语法格式: class 子类类名(父类1[,父类2,...]):类体如果在类定义中没有指定父类,则默认父类是 object类 。也就是说,object 是所有类的父类,里面定义了一些所有类共有的默认实现,比…

Python接口自动化 —— Web接口!

1.2.1 web接口的概念 这里用一个浏览器调试工具捕捉课程管理页面请求作为例子: 当请求页面时,服务器会返回资源,将协议看做是路的话,http可以看做高速公路,soap看做铁路传输的数据有html,css&#xff0…

【文献分享】PCCP:机器学习 + 分子动力学 + 第一性原理 + 热学性质 + 微观结构

分享一篇关于机器学习 分子动力学 第一性原理 热学性质(密度、粘度、扩散系数) 微观结构的文章。 感谢论文的原作者! 关键词: 1. Machine learning, 2. Deep potential, 3. Molecular dynamics 4. Molten salt, 5. Thermo…

OCP-数据库中的小米SU7

oracle ocp ​数据库中的SU7 ​好看又好用 需要找工作和落户的快来

剑指offer剪绳子;leetcode:LCR 131. 砍竹子 I

现需要将一根长为正整数 bamboo_len 的竹子砍为若干段&#xff0c;每段长度均为正整数。请返回每段竹子长度的最大乘积是多少。 示例 1&#xff1a; 输入: bamboo_len 12 输出: 81提示&#xff1a; 2 < bamboo_len < 58 注意&#xff1a;本题与主站 343 题相同&#…

基于峰谷分时电价引导下的电动汽车充电负荷优化

在研究电动汽车用户充电需求的前提下&#xff0c;利用蒙特卡洛方法对&#xff12;种不同充电方式进行模拟并对其进行分 析&#xff1b;分析用户响应度对电动汽车有序充电的影响&#xff0c;建立峰谷分时电价对电动汽车负荷影响的模型&#xff0c;在模拟出电动汽 车无序充电负荷…

Windows 部署ChatGLM3大语言模型

一、环境要求 硬件 内存&#xff1a;> 16GB 显存: > 13GB&#xff08;4080 16GB&#xff09; 硬盘&#xff1a;60G 软件 python 版本推荐3.10 - 3.11 transformers 库版本推荐为 4.36.2 torch 推荐使用 2.0 及以上的版本&#xff0c;以获得最佳的推理性能 二、部…

重生奇迹mu恶魔来袭副本

在游戏重生奇迹mu中&#xff0c;恶魔来袭副本是玩家能够组队通过的副本。但是因为手游组队的不方便性&#xff0c;部分玩家对其还是非常苦手。而今天&#xff0c;我们就给大家讲解一下这个游戏的双人通关攻略。 1、挂机找怪手动输出 (1)对于普通剧情副本而言&#xff0c;挂机…

利用CNN-Bigru-Attention模型输电线路故障诊断(Python代码,TensorFlow框架,)

效果视频&#xff1a;利用CNN-Bigru-Attention模型输电线路故障诊断(Python代码&#xff0c;TensorFlow框架&#xff0c;压缩包带有数据集和代码&#xff0c;解压缩可直接运行)_哔哩哔哩_bilibili 售后包免费远程协助运行&#xff08;用向日葵或者todesk软件协助&#xff09; …

校园智能水电预付费管理系统

校园智能水电预付费管理系统是一种专为学校水电资源管理而设计的智能化系统&#xff0c;旨在提供全面的水电资源管理解决方案&#xff0c;满足校园管理者对水电资源管理的需求。该系统整合了先进的智能技术和云计算&#xff0c;为校园管理者提供了实时监控、自动计费、节能管理…

如何将图片你分辨率调整到350dpi?分辨率快速设置工具

图片的分辨率通常用在打印照片和一些考试平台对上传证件照的要求上&#xff0c;我们平时拍摄的图片dpi大多都是96的&#xff0c;所以不符合使用需求&#xff0c;那么怎么把这些比较低分辨率的图片修改到350dpi呢&#xff1f;试试本文分享的这几个方法吧&#xff0c;简单又方便。…

使用阿里云试用Elasticsearch学习:创建仪表板pivot、搜索discover和仪表板dashboard

文档&#xff1a;https://www.elastic.co/guide/en/elasticsearch/reference/current/transform-examples.html#example-clientips 在kibana左栏打开Transforms&#xff0c;并创建Transforms&#xff08;转换&#xff09; Management > Stack Management > Data > T…

component-传入值圆形百分比展示,.background-image: conic-gradient()

1.效果 2.代码 <template><div class"circle" :style"{ background-image: conic-gradient(#3498db 0 ${fillPercentage}%, transparent ${fillPercentage}% 100%) }"></div> <!-- 使用动态绑定样式来设置填充效果 --> </temp…

放大招,推广手机流量卡,佣金丰厚等你来拿

流量卡推广是一个非常冷门但又在身边非常常见的行业&#xff0c;知道的人目前靠着这个信息&#xff0c;发了很多小财&#xff0c;可以说早知道这一行的人会非常容易变成暴发户。 你可能也会好奇&#xff0c;为什么那么多广告都是在推流量卡&#xff0c;他们推卡到底有多高的利…

SpringBoot配置文件加载顺序

一、内部配置加载顺序 SpringBoot程序启动时&#xff0c;会从以下位置加载配置文件&#xff1a; file:./config/ &#xff1a;当前项目的config目录下&#xff1b;file:./ &#xff1a;当前项目的根目录下&#xff1b;classpath:/c…

L1-086 斯德哥尔摩火车上的题

上图是新浪微博上的一则趣闻&#xff0c;是瑞典斯德哥尔摩火车上的一道题&#xff0c;看上去是段伪代码&#xff1a; s a 1112031584 for (i 1; i < length(a); i) {if (a[i] % 2 a[i-1] % 2) {s max(a[i], a[i-1])} } goto_url(www.multisoft.se/ s)其中字符串的 …

STM32 CAN控制的相关结构体(标准库)

STM32 CAN控制的相关结构体&#xff08;标准库&#xff09; 初始化结构体&#xff1a; CAN_InitTypeDef CAN_Prescaler 本成员设置CAN外设的时钟分频&#xff0c;它可控制时间片Tq的时间长度&#xff0c;这里设置的值最终会减1后再写入BRP寄存器位&#xff0c;即前面介绍的Tq计…