一、先记住一句话
这四个函数是 Python re 模块最核心的 4 个查找方法,功能完全不同:
- • re.match():只从字符串开头匹配,开头不满足直接失败
- • re.search():整个字符串搜索,找到第一个就停止
- • re.findall():查找所有匹配,返回 列表
- • re.finditer():查找所有匹配,返回 迭代器(节省内存)
二、re.match() —— 只匹配开头
1. 作用
从字符串最开头开始匹配,开头不匹配直接返回 None。
2. 语法
re.match(正则模式, 字符串)
3. 示例
import re
# 成功:开头是数字
print(re.match(r"\d+", "123abc")) # 返回匹配对象
# 失败:开头不是数字
print(re.match(r"\d+", "abc123")) # None
4. 什么时候用?
三、re.search() —— 全局找第一个
1. 作用
扫描整个字符串,找到第一个匹配就返回,不再继续找。
2. 语法
re.search(正则模式, 字符串)
3. 示例
import re
s = "abc123def456"
res = re.search(r"\d+", s)
print(res.group()) # 123(只返回第一个)
4. 特点
四、re.findall() —— 找所有,返回列表(最常用)
1. 作用
找到字符串中所有匹配的内容,以 列表 形式返回。
2. 语法
re.findall(正则模式, 字符串)
3. 示例
s = "abc123def456xyz789"
res = re.findall(r"\d+", s)
print(res) # ['123','456','789']
4. 特点
五、re.finditer() —— 找所有,返回迭代器
1. 作用
查找所有匹配,返回一个迭代器,里面是一个个匹配对象。
2. 语法
re.finditer(正则模式, 字符串)
3. 示例
s = "abc123def456"
it = re.finditer(r"\d+", s)
formatchin it:
print(match.group()) # 123,然后 456
4. 特点
六、最核心区别对比表(必背)
| | | | |
| re.match() | | | | |
| re.search() | | | | |
| re.findall() | | 列表 | | |
| re.finditer() | | 迭代器 | | |
七、分组(捕获)在四个方法中的表现(重点难点)
1. 无分组时
四个方法表现一致:返回匹配到的字符串。
2. 有一个分组 ( )
- •
search / match / finditer 返回完整匹配对象
示例:
s = "age:18, score:95"
print(re.findall(r"(\d+)", s)) # ['18','95']
3. 多个分组 ( )( )
findall() 返回 元组列表
s = "a1 b2 c3"
print(re.findall(r"([a-z])(\d)", s))
# [('a','1'), ('b','2'), ('c','3')]
八、获取匹配内容的方法
只要得到 匹配对象,就可以用:
示例:
res = re.search(r"\d+", "abc123")
print(res.group()) # 123
print(res.span()) # (3,6)
九、最经典使用场景
1. 验证开头
re.match(r"^[a-z]+", text)
2. 判断是否包含某内容
if re.search(r"\d", text):
print("包含数字")
3. 提取所有数据(最简单)
nums = re.findall(r"\d+", text)
4. 大数据量、需要位置/分组信息
for m in re.finditer(r"\w+@\w+\.\w+", text):
print(m.group())
📝 本章超级总结
- 1. re.match()
只匹配开头,适合校验格式。 - 2. re.search()
全局找第一个,适合判断是否存在。 - 3. re.findall()
找全部,返回列表,最简单最常用。 - 4. re.finditer()
找全部,返回迭代器,省内存、功能强。