前言
在上一篇我们学习了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
中的所有数字(123
和 456
)替换为 "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()
。
好了,今日分享到此一游,我是好运,想要好运,关注我点赞不迷路,一起成长