上一篇我们学会的如何使用python爬虫请求库的requests基本使用方法,也意味着大家能够对python爬虫有一个清晰的认知和较完善的系统理论。这次我们学习一下爬虫解析库。
要是不太清楚请求库的使用,可以再次复习,毕竟温故而知新,可以为师矣。下面有文章链接
项目三:学会如何使用python爬虫请求库(小白入门级)-CSDN博客
首先我们要先学习一下什么是正则表达式。话不多说,开始学习
正则表达式
简介
正则表达式(Regular Expression,简称regex或regexp)是一种强大的文本处理工具,它使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。正则表达式可以用于执行各种字符串搜索、替换、分割和校验等操作。
正则表达式由一系列字符和特殊符号组成,这些字符和符号按照正则表达式的语法规则组合起来,形成一个搜索模式。这个模式可以用来检查一个字符串是否包含某种特定的字符组合,比如电话号码、电子邮件地址、URL等。
作用
正则表达式广泛应用于各种编程语言和文本编辑器中,是文本处理和数据清洗的重要工具。如下:
文本搜索、文本替换、文本解析、数据验证、日志分析、自然语言处理和安全性
正则表达式的强大之处在于它们的灵活性和表达能力,可以匹配简单的文本模式,也可以构建非常复杂的匹配规则。掌握正则表达式的使用,对于任何需要进行文本处理的开发者或数据分析师来说,都是一项非常有价值的技能。
语法规则
- 字符匹配:使用普通字符匹配,如 "abc" 匹配 "abc"。
- 字符类:使用方括号 [] 来匹配一个字符类,如 "[abc]" 匹配 "a"、"b" 或 "c"。
- 反义字符类:使用方括号和插入符号 ^ 来匹配不在字符类中的字符,如 "[^abc]" 匹配除了 "a"、"b" 和 "c" 以外的字符。
- 转义字符:使用反斜杠 \ 来转义特殊字符,如 "." 匹配句点字符。
- 元字符:使用元字符来匹配特定类型的字符,如 \d 匹配任意数字字符。
- 重复匹配:使用量词来表示字符、字符类或分组的重复次数,如 "a{2,4}" 匹配 "aa"、"aaa" 或 "aaaa"。
- 分支条件:使用竖线 | 来表示多个匹配分支的选择,如 "abc|def" 匹配 "abc" 或 "def"。
- 分组:使用圆括号 () 来创建匹配组,并且可以对组应用量词和其他操作符,如 "(ab)+" 匹配 "ab"、"abab" 等。
- 锚点:使用锚点来匹配位置,如 "^abc" 匹配以 "abc" 开头的字符串。
- 其他操作符:还有一些其他的特殊操作符,如零宽断言、贪婪与非贪婪匹配等。
只需要知晓正则表达式的常用语法规则即可,这个对于爬虫数据有着重要作用。
当然遇到正则表达式可以直接在网络搜索一下解析正则表达式的工具即可。无需耗时耗力去查看
好了,我们能够知晓正则表达式的基本语法规则和作用,接下来我们要认识一下python中的re模块了
re模块
简介
Python的re
模块是标准库中的一个正则表达式库,它提供了一系列的函数和类,用于处理和操作文本数据。正则表达式是一种强大的文本处理工具,它允许你通过定义复杂的模式来搜索、匹配、替换和分割字符串。
提示:"re"是正则表达式(Regular Expression)的缩写,因此Python的正则表达式模块被命名为re模块。
作用
- 搜索:在文本中查找符合特定模式的字符串。
- 匹配:验证字符串是否符合某个模式,常用于数据验证。
- 替换:将匹配到的文本替换为新的文本。
- 分割:根据匹配到的模式将字符串分割成多个部分。
- 解析:从复杂的文本结构中提取数据,如HTML、XML等。
语法
re.match()
:检查字符串的开头是否匹配某个模式。re.search()
:在整个字符串中搜索匹配某个模式的地方。re.findall()
:找到字符串中所有匹配某个模式的子串。re.finditer()
:找到字符串中所有匹配某个模式的地方,返回一个迭代器,每个元素都是一个匹配对象。re.sub()
:替换字符串中匹配某个模式的部分为指定的文本。re.split()
:根据匹配某个模式的边界来分割字符串。re.compile()
:编译正则表达式,返回一个正则表达式对象,可以提高效率,特别是当同一个表达式需要多次使用时
(注意语法规则上面正则表达式已经有了,这里是re模块的函数用法,别搞错了哦)
用法
1.re.match()
re.match()
函数是Python中re
模块提供的一个功能,用于检查字符串的开头是否与指定的正则表达式模式匹配。如果字符串的开头符合模式,re.match()
将返回一个匹配对象,否则返回None
。
示例代码如下
import re
# 定义一个正则表达式模式
pattern = r'^Hello'
# 测试字符串
text = 'Hello World'
# 使用re.match()检查字符串开头是否匹配模式
match = re.match(pattern, text)
# 判断是否有匹配
if match:
print('匹配成功:', match.group())
else:
print('没有匹配')
示例代码输出结果
解释:图片第七行代码使用 re 模块中的 match 函数来检查字符串 text 是否以模式 pattern 开头。如果匹配成功,match 函数会返回一个 Match 对象,否则返回 None。
案例:匹配电子邮件地址
根据re.match()
函数来仿写一个简单的匹配电子邮件地址,示例代码如下:
import re
# 定义一个匹配电子邮件地址的正则表达式模式
pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
# 测试字符串
text = 'user@example.com'
# 使用re.match()检查字符串开头是否匹配模式
match = re.match(pattern, text)
# 判断是否有匹配
if match:
print('有效的电子邮件地址:', match.group())
else:
print('无效的电子邮件地址')
案例输出结果
请注意:re.match()
只检查字符串的开头,如果需要在整个字符串中进行匹配,可以使用re.search()
函数。
不过有可能大家不知道这个邮箱地址的正则表达式是怎么定义了,所以先看下面的解释,会给你有一个明确的认知。
代码中正则表达式模式
r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
是用来匹配电子邮件地址的。下面是这个模式的详细解释:
^
:锚定符,表示匹配字符串的开始。[a-zA-Z0-9._%+-]+
:匹配一个或多个字母(大写或小写)、数字、点号、下划线、百分号、加号或减号。这部分对应电子邮件地址的用户名部分。@
:字面字符,匹配电子邮件地址中的"@"符号。[a-zA-Z0-9.-]+
:匹配一个或多个字母(大写或小写)、数字、点号或减号。这部分对应电子邮件地址的域名部分。\.
:转义字符,匹配点号,因为点号在正则表达式中有特殊含义(匹配任意字符),所以需要转义。[a-zA-Z]{2,}
:匹配两个或更多字母(大写或小写)。这部分对应电子邮件地址的顶级域名(如.com
、.org
等)。$
:锚定符,表示匹配字符串的结束。整个模式确保了字符串从开始到结束正好匹配一个完整的电子邮件地址格式。这意味着,如果字符串中包含电子邮件地址,但不是唯一的内容,或者电子邮件地址不完整,都不会匹配成功。
例如,这个模式会匹配
"user@example.com"
,但不配"user@example"
或"user@@example.com"
,因为这些字符串要么缺少顶级域名,要么在@
符号前后有多余的字符。
2.re.search()
re.search()
是 Python re
模块中的一个函数,它用于在整个字符串中搜索匹配指定正则表达式模式的部分。如果找到匹配,re.search()
返回一个匹配对象;如果没有找到匹配,返回 None
。
示例代码如下
import re
# 定义一个正则表达式模式
pattern = r'\d+' # 匹配一个或多个数字
# 测试字符串
text = "There are 123 apples and 456 oranges."
# 使用 re.search() 搜索匹配模式
match = re.search(pattern, text)
# 检查是否有匹配,并打印结果
if match:
print("找到匹配:", match.group()) # 打印匹配的文本
else:
print("没有找到匹配")
提示
正则表达式
r'\d+'
是一个用于匹配一个或多个数字的模式。这个模式可以应用于任何包含数字的字符串,提取出连续的数字序列。下面是对这个正则表达式的详细解释:
r
:前缀r
表示这是一个原始字符串(raw string),在 Python 中,这意味着字符串中的反斜杠(\
)不会被当作转义字符。这对于正则表达式尤其有用,因为它通常包含许多需要转义的特殊字符。在正则表达式中使用r
前缀可以避免不必要的转义,使模式更易于阅读和编写。
\d
:这是一个预定义的字符集,用于匹配任何单个数字字符。在大多数正则表达式引擎中,\d
等价于[0-9]
,即匹配从 0 到 9 的任何一个数字。
+
:这是一个量词(quantifier),用于指定前面的元素(在这个例子中是\d
)应该出现一次或多次。因此,\d+
表示匹配一个或多个连续的数字字符。总的来说,
r'\d+'
会匹配任何由一个或多个数字组成的序列,例如123
、45678
、9
等。这个正则表达式在数据验证、日志分析、文本处理等场景中非常有用,尤其是当你需要从文本中提取数字信息时可以用到。
输出结果如下
可以看到成功输出”找到匹配:123“的响应信息。
案例:查找所有的电子邮件地址
使用re.search()来仿写一个简单的案例来查找所有的电子邮件并匹配
示例代码如下
import re
# 定义一个匹配电子邮件地址的正则表达式模式
pattern = r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}'
# 测试字符串,包含多个电子邮件地址
text = "Contact us at info@example.com or support@example.org."
# 使用 re.search() 搜索匹配模式
match = re.search(pattern, text)
# 检查是否有匹配,并打印结果
if match:
print("找到电子邮件地址:", match.group())
else:
print("没有找到电子邮件地址")
输出结果如下
小心意:re.search()
是一个非常有用的函数,可以在不确定匹配项是否出现在字符串的开始、中间或末尾时使用。它允许你在较大的文本块中搜索特定的文本模式,而不必担心匹配的位置。
re.match()和re.search()的区别
re.match()
和re.search()
都是Python中re
模块提供的函数,用于处理正则表达式匹配,但它们在匹配字符串时的行为有所不同:
-
re.match():
re.match()
尝试从字符串的起始位置匹配一个模式。如果起始位置没有匹配成功,re.match()
会返回None
。- 这意味着,
re.match()
只在字符串的开头进行匹配检查。如果匹配成功,返回的匹配对象将包含有关匹配的信息,如匹配的文本、位置等。 re.match()
适用于验证整个字符串是否符合某个模式,例如,检查一个字符串是否是有效的电子邮件地址。
-
re.search():
re.search()
在整个字符串中搜索模式的匹配。只要字符串中有任何位置符合模式,re.search()
就会返回一个匹配对象,而不管匹配出现在字符串的哪个位置。- 如果没有找到匹配,
re.search()
同样会返回None
。 re.search()
适用于在字符串中查找特定模式的任意出现,不关心匹配的位置。
两个函数对比示例
import re
# 字符串
text = "No match at the beginning: 123."
# 使用 re.match() 检查字符串开头
match_start = re.match(r'\d+', text)
print("re.match():", match_start) # 输出: None,因为开头没有数字
# 使用 re.search() 在整个字符串中搜索
match_search = re.search(r'\d+', text)
print("re.search():", match_search) # 输出: <re.Match object; span=(21, 24), match='123'>
输出结果
可以看到在这个示例中,re.match()
没有找到匹配,因为字符串的开头没有数字。而re.search()
找到了匹配,因为数字123
出现在字符串的中间。
好了,今日分享到此一游,点个关注不迷路。后期继续写出高质量的技术性文章,希望好运常伴吾身,感谢有你💖