python爬虫之正则详解

news/2024/12/22 9:53:36/

正则表达式是一种使用单个字符串来描述、匹配和定位文本中某个特定模式的工具。在 Python 编程语言中,正则表达式可以用来处理各种文本数据、数据采集和处理、爬虫和搜索等方面。在本文中,我们将学习如何在 Python 爬虫中使用正则表达式,包括语法规则,匹配模式,以及在代码中如何使用。

语法规则

在 Python 语言中,我们可以使用标准库中的 re 模块来处理正则表达式。

1. 创建正则表达式对象

要使用正则表达式,我们首先需要创建一个正则表达式对象。通常,我们可以使用 re.compile() 函数将正则表达式编译成一个对象。该方法接受一个正则表达式字符串作为参数,并返回编译后的正则表达式对象。

例如,下面的代码演示了如何创建一个正则表达式对象:

import re# 创建正则表达式对象
pattern = re.compile(r'hello')

2. 正则表达式字符集

在编写正则表达式时,可以使用字符集来匹配特定的字符或字符序列。字符集中的每个字符表示匹配过程中的一个字母、数字或特殊字符。下面是一些常用的字符集:

字符描述
.匹配任何字符
\d匹配任何一个数字字符
\D匹配任何非数字字符
\w匹配任何字母数字字符
\W匹配任何非字母数字字符
[abc]匹配任何一个 a、b 或 c 字符
[^abc]匹配任何不是 a、b 或 c 的字符
[a-zA-Z0-9]匹配任何字母或数字字符。

下面的代码演示了如何使用正则表达式字符集匹配一个 IP 地址:

import re# 创建正则表达式对象
pattern = re.compile(r'\d+\.\d+\.\d+\.\d+')# 匹配 IP 地址
text = '127.0.0.1 localhost'
result = pattern.search(text)if result:print(result.group())

3. 正则表达式修饰符

在 Python 的正则表达式中,通过修饰符可以更改匹配行为。下面是一些常用的修饰符:

修饰符描述
I使匹配不区分大小写
S让 “.” 匹配任何字符,包括换行符
M多行匹配模式,匹配每行的开头和结尾
X允许你编写更易读的正则表达式,可以灵活写注释。

下面的代码演示了如何使用修饰符来进行匹配:

import re# 匹配多行文本
pattern = re.compile('''^ # 匹配开头\w+ # 匹配一个或多个单词字符@ # 匹配 @ 符号\w+\.com  #匹配以 .com 结尾的域名$ # 匹配结尾
''', re.MULTILINE | re.X)# 测试多行文本
text = '''
jerry@yahoo.com
tom_grey@gmail.com
jack2012@163.com
'''
print(pattern.findall(text))

4. 正则表达式中的特殊元字符

在正则表达式中,还有一些特殊字符的含义可以不再匹配它们本身,而是匹配一些非常具体的内容。下面是一些常用的特殊元字符:

元字符描述
^匹配行的开头
$匹配行的结尾
*匹配 0 次或多次前面的字符
+匹配 1 次或多次前面的字符
?匹配 0 次或 1 次前面的字符
{m}匹配 m 次前面的字符
{m,n}匹配 m 到 n 次前面的字符
( )分组匹配,捕获匹配的字符串,可以使用非捕获分组 (?: )
\转义字符,可以将特殊字符转换为字面字符

下面的代码演示了如何使用正则表达式匹配字符串中的电话号码:

import re# 匹配电话号码
pattern = re.compile(r'(\d{3})-(\d{4}-\d{4})')# 测试字符串
text = 'Jerry\'s phone number is: 139-1111-2222, and Tom\'s is 137-2222-3333'# 匹配电话号码
result = pattern.search(text)# 输出结果
while result:print(result.group()) # 输出完整电话号码print(result.group(1)) # 输出区号print(result.group(2)) # 输出号码result = pattern.search(text, result.end()) # 继续查找下一个电话号码

5. 正则表达式函数

Python 的 re 模块中提供了很多函数来处理正则表达式,下面是一些常用的函数:

函数名描述
match()匹配一个字符串,并返回匹配对象
search()在一个字符串中搜索匹配正则表达式的第一个位置,并返回匹配对象
findall()在一个字符串中搜索匹配正则表达式的所有位置,并返回匹配对象列表
finditer()在一个字符串中搜索匹配正则表达式的所有位置,并返回可迭代对象
split()根据正则表达式分隔字符串并返回列表
sub()使用一个字符串替换所有正则表达式匹配到的地方,并返回替换后的字符串
subn()类似于 sub() 函数,但返回的是替换后的字符串和替换次数
compile()编译正则表达式并返回正则表达式对象
purge()删除缓存中的正则表达式
template()通过使用占位符替换掉正则表达式中的某些部分,并返回替换后的字符串

下面是一个使用正则表达式进行匹配和替换的示例:

import re# 模式和替换字符串
pattern = re.compile(r'(\d{4})-(\d{2})-(\d{2})')
replace_str = r'\3/\2/\1'# 测试字符串
text = 'Today is 2022-08-30'# 替换日期格式
result = pattern.sub(replace_str, text)# 输出结果
print(result) # 输出 "Today is 30/08/2022" 

总结

正则表达式是一种非常有用的工具,可以在 Python 爬虫中处理各种文本数据,并获得更精细的匹配。在使用正则表达式时,需要注意一些语法规则,特殊字符和函数。使用这些规则和函数,可以更好地管理和处理文本数据,并将其用于各种应用程序中。


http://www.ppmy.cn/news/69881.html

相关文章

【前端面经】JS-异步解决方案

同步和异步 众所周知, JavaScript是一门单线程的语言, 单线程就意味着同一时间只能执行一个任务, 当前任务执行结束, 才会执行下一个任务. 这种模式的好处就是执行环境比较单纯, 但坏处也很明显, 一旦有某个任务卡住了, 就会导致整个程序阻塞. 为了解决这个问题, JS将任务的执…

【Java】基础知识点总结

Java学习记录---已完成 Java基础第一部分:变量、操作符、控制流程、数据结构第二部分:类和对象第三部分:接口与继承第四部分:数字与字符串第五部分:日期 学习地址: HOW2J.CN Java基础 第一部分:变量、操作…

三、Neo4j 源码研究系列 - 持久化

version: v-2023051401 author: 路__ 说到数据库,那么离不开的模块就是持久化(Persistence),数据持久化是数据库不可缺少的重要组成模块之一。可以说一个数据库少了持久化功能,可以说这个数据库就不足以称为数据库。…

使用thrift进行RPC通信(附c程序示例)

前言 为了实现不同语言的程序跨进程、跨主机通信,一般可以采用mq或rpc框架来实现。 对于异步通知的场景可以使用mq,如zeroMQ。 但对于某些实时性较强且同步的应用场景,使用成熟的rpc框架来实现也是一种比较更好的选择。 开源的rpc框架有很…

JS 实现区块链分布式网络

JS 实现区块链网络 这里主要 JS 实现区块链 实现的部分继续下去,对 Blockchain 这个对象有一些修改,如果使用 TS 的话可能要修改对应的 interface,但是如果是 JS 的话就无所谓了。 需要安装的依赖有: express body-parser 现在…

Windows cmd命令行计划任务使用详解

哈喽,大家好,我是[有勇气的牛排](全网同名)🐮🐮🐮 有问题的小伙伴欢迎在文末[评论,点赞、收藏]是对我最大的支持!!!。 https://www.couragestea…

postman接口自动化测试

Postman除了前面介绍的一些功能,还有其他一些小功能在日常接口测试或许用得上。今天,我们就来盘点一下,如下所示: 1.数据驱动 想要批量执行接口用例,我们一般会将对应的接口用例放在同一个Collection中,然…

剑指 Offer 58 - II. 左旋转字符串(3种方法)

题目: 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。 请定义一个函数实现字符串左旋转操作的功能。 比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。 示例 1&…