在上一篇我们学习re模块的三个函数用法,这一次我们在继续学一下另外两个函数的用法,就当我们修炼境界一样去不断的升级。好了,我们来学习re.compile 函数和re.split函数的用法
友情提示:忘了复习一下项目五:学会如何使用python爬虫解析库(小白小成级)-CSDN博客
re.compile ()
简介
re.compile()
是 Python re
模块中的一个函数,它用于编译一个正则表达式模式,将其转换为一个正则表达式对象(RegexObject
)。
这样做的好处是可以提高效率,特别是当你需要多次使用同一个正则表达式进行匹配时。编译后的正则表达式对象可以用于匹配字符串,并且提供了更多的方法,如 search()
、match()
、findall()
等。
作用
- 性能提升:编译后的正则表达式可以重复使用,避免了每次匹配时重新解析正则表达式的开销。
- 灵活性:编译后的正则表达式对象可以用于更复杂的文本处理,如使用捕获组、查找多个匹配项等。
- 正则表达式重用:当你需要在程序的不同部分使用相同的正则表达式时,编译并保存正则表达式对象可以避免重复编译。
语法
re.compile(pattern, flags=0)
代码解释
pattern
:要编译的正则表达式模式,可以是一个字符串或正则表达式对象。flags
:可选参数,用于修改正则表达式的匹配方式。re.IGNORECASE
或re.I
:忽略大小写。re.MULTILINE
或re.M
:多行匹配。re.DOTALL
或re.S
:点号(.
)匹配所有字符,包括换行符。re.UNICODE
或re.U
:使\w
,\W
,\b
,\B
,\d
,\D
,\s
和\S
依赖于 Unicode 字符属性数据库。re.VERBOSE
或re.X
:允许使用更易于阅读的正则表达式,忽略空格和注释。
案例
编译正则表达式并使用
import re
# 编译一个正则表达式,用于匹配一个或多个数字
pattern = re.compile(r'\d+')
# 使用编译后的正则表达式对象的 search 方法
text = "There are 123 apples and 456 oranges."
match = pattern.search(text)
if match:
print("找到数字序列:", match.group())
else:
print("没有找到数字序列")
输出结果
在这个例子中,我们首先使用 re.compile()
编译了一个用于匹配数字序列的正则表达式。然后,我们使用编译后的正则表达式对象的 search()
方法在文本中搜索第一个匹配的数字序列。
其他方法案例例如 search()
、match()
、findall()
等如下(选用一个)
使用正则表达式对象的 finditer 方法
import re
# 编译一个正则表达式,用于匹配所有数字
pattern = re.compile(r'\d+')
# 使用 finditer 方法查找所有匹配的数字
text = "Today is 04/01/2023 and the temperature is 20°C."
for match in pattern.finditer(text):
print("找到数字:", match.group())
输出结果
在这个例子中,我们使用 finditer()
方法找到了文本中的所有数字序列。finditer()
返回一个迭代器,每个迭代项都是一个 Match
对象,包含了匹配的详细信息。
编译正则表达式对象提供了一种高效和灵活的方式来处理文本匹配,特别是在需要重复使用同一个正则表达式模式时。
re.split()
简介
re.split()
是 Python re
(正则表达式)模块中的一个函数,它使用正则表达式来分割字符串。
这个函数可以根据匹配正则表达式的模式来分割字符串,返回一个包含所有分割部分的列表。
作用
- 主要用于将字符串分割成多个子字符串,分割点由正则表达式定义的模式确定。
- 可以处理复杂的分割任务,如分割 HTML 或 CSV 数据,或者根据特定字符集分割文本。
语法
re.split(pattern, string, maxsplit=0, flags=0)
pattern
:要使用的正则表达式模式,用于定义分割点。string
:需要被分割的原始字符串。maxsplit
:(可选)一个整数,指定最大分割次数。默认为 0,表示没有限制分割次数。flags
:(可选)用于修改正则表达式的匹配方式的标志。
案例
1.分割字符串
import re
# 使用空白字符分割字符串
result = re.split(r'\s+', 'One two\tthree\nfour')
print(result) # 输出: ['One', 'two', 'three', 'four']
# 使用逗号分割字符串,忽略空白字符
result = re.split(r',\s*', 'One, two, three, four')
print(result) # 输出: ['One', 'two', 'three', 'four']
输出结果
在这个例子中,我们使用 re.split()
函数来分割字符串。第一个案例中,我们使用一个或多个空白字符(包括空格、制表符和换行符)作为分割点。
2.分割字符串并限制次数
import re
# 使用冒号分割字符串,但只分割前两次
result = re.split(r':', 'key1:value1:key2:value2:key3', maxsplit=2)
print(result) # 输出: ['key1', 'value1', 'key2:value2:key3']
输出结果
第二个案例中,我们使用逗号作为分割点,并通过 \s*
匹配跟随逗号的任意数量的空白字符。
在这个案例中,我们使用 maxsplit
参数来限制分割次数,这样只会分割前两次冒号,返回的列表中包含了剩余未分割的部分。
re.split()
是一个强大的工具,它提供了比基本字符串操作更复杂的分割功能,允许你根据正则表达式模式来分割文本。
简单项目应用
re.split()
和 re.compile()
可以结合使用来执行更复杂的文本分割任务。以下是两个函数的项目案例使用:
案例 1:使用 re.split()
分割 HTML 标签和文本
假设你有一个 HTML 字符串,你想要分割它以提取纯文本内容。
import re
html_content = '<html><head><title>Test</title></head><body><p>Some text</p></body></html>'
# 编译一个正则表达式,用于匹配 HTML 标签
tag_pattern = re.compile(r'<[^>]+>')
# 使用 re.split() 分割 HTML 标签和文本
text_parts = tag_pattern.split(html_content)
# 打印文本部分
for part in text_parts:
if part.strip(): # 确保不打印空字符串
print(part)
输出结果
在这个案例中,我们首先使用 re.compile()
编译一个正则表达式,该表达式匹配任何 HTML 标签。然后,我们使用 re.split()
根据这个模式来分割 HTML 字符串,得到一个包含文本部分的列表。
案例 2:使用 re.compile()
和 re.split()
分割 CSV 数据
假设你有一个 CSV(逗号分隔值)字符串,你想要分割它以提取数据。
import re
csv_content = 'One,Two,Three,"Four, Five",Six'
# 编译一个正则表达式,用于匹配 CSV 数据
# 注意:我们使用 re.escape() 来确保逗号被正确转义
csv_pattern = re.compile(r',(?=(?:[^"]*"[^"]*")*[^"]*$)')
# 使用 re.split() 分割 CSV 数据
csv_parts = csv_pattern.split(csv_content)
# 打印 CSV 数据部分
for part in csv_parts:
print(re.sub(r'"(.*?)"', r'\1', part.strip()))
输出结果
在这个案例中,我们使用 re.compile()
编译一个正则表达式,该表达式匹配 CSV 文件中的逗号,同时考虑到可能存在的带引号的字段。然后,我们使用 re.split()
来分割 CSV 字符串。最后,我们使用 re.sub()
来移除字段周围的引号。
这两个案例展示了 re.compile()
和 re.split()
如何结合使用来处理复杂的文本分割任务,特别是在需要考虑特殊字符或格式时。通过编译正则表达式,我们可以提高代码的可读性和性能
在实际的爬虫应用中,
re.split()
常用于初步处理和清洗数据,而re.compile()
则用于定义复杂的匹配规则,尤其是当这些规则需要在爬虫的不同部分重复使用时。通过使用这些正则表达式函数,可以更有效地从网页中提取有用信息。
两个函数的用法想必我们会简单的应用,后期我会继续完善爬虫理论,能够让爬虫技术不在变了杂乱无章,同时将理论用于项目实战。也希望实践能够纠正理论。
好了,我是好运,想要好运。今日分享,到此一游。