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

本文介绍了Pythonre模块中的re.sub(),re.findall(),和re.finditer()函数,分别讲解了它们的用途、代码用法和实际案例,帮助读者掌握正则表达式在文本处理中的关键功能。
摘要由CSDN通过智能技术生成
前言

在上一篇我们学习了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()

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

  • 29
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

好运2024

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

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

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

打赏作者

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

抵扣说明:

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

余额充值