一、分组捕获 ()核心作用
1. 什么是分组
在正则中,用小括号 () 包裹一部分规则,就是分组 / 捕获组。
作用:
2. 基础语法
import re
text = "姓名:小明,年龄:18"
# 两个捕获组
pattern = r"姓名:(\w+),年龄:(\d+)"
res = re.search(pattern, text)
二、re.group() 获取分组内容
1. group() 用法
- •
group() / group(0):获取整体全部匹配内容
完整示例
import re
text = "姓名:小明,年龄:18"
pat = r"姓名:(\w+),年龄:(\d+)"
m = re.search(pat, text)
print(m.group()) # 整体:姓名:小明,年龄:18
print(m.group(1)) # 第1组:小明
print(m.group(2)) # 第2组:18
2. groups() 批量获取所有分组
返回元组,包含所有捕获组内容
print(m.groups()) # ('小明', '18')
3. 命名分组(进阶,可读性更高)
语法:(?P<分组名>规则)
pat = r"姓名:(?P<name>\w+),年龄:(?P<age>\d+)"
m = re.search(pat, text)
print(m.group("name")) # 小明
print(m.group("age")) # 18
三、findall 中分组的特殊规则(高频易错)
text = "a1 b2 c3"
# 单个分组
print(re.findall(r"(\w\d)", text))
# ['a1','b2','c3']
# 两个分组
print(re.findall(r"(\w)(\d)", text))
# [('a','1'),('b','2'),('c','3')]
四、re.sub() 正则字符串替换
1. 基础语法
re.sub(pattern, repl, string, count=0)
2. 基础替换示例
text = "123abc456"
# 把所有数字替换为 *
new_text = re.sub(r"\d", "*", text)
print(new_text) # ***abc***
3. 分组反向引用 \1 \2
在替换字符串中,用 \1 代表第1个分组,\2 代表第2分组。
text = "2026-04-26"
# 把 年-月-日 换成 月/日/年
res = re.sub(r"(\d{4})-(\d{2})-(\d{2})", r"\2/\3/\1", text)
print(res) # 04/26/2026
4. 限制替换次数
text = "111 222 333"
# 只替换前2组数字
res = re.sub(r"\d+", "000", text, count=2)
print(res)
5. 替换结合函数(高级)
复杂逻辑:匹配到的内容交给函数处理再替换
deffunc(match):
returnmatch.group().upper()
text = "hello python"
res = re.sub(r"\w+", func, text)
print(res)
五、re.compile() 正则表达式编译
1. 作用
2. 基础语法
# 编译正则
pat = re.compile(r"\d+")
# 直接调用方法
res1 = pat.findall("abc123def456")
res2 = pat.search("test789")
print(res1)
print(res2.group())
3. 编译时指定修饰符
常用修饰符:
- •
re.I / re.IGNORECASE:忽略大小写 - •
re.S / re.DOTALL:. 匹配换行符
# 忽略大小写匹配
pat = re.compile(r"python", re.I)
text = "Python PYTHON python"
print(pat.findall(text))
4. 优势场景
六、无捕获分组 (?: ) 了解
语法:(?:规则)
- • 不会被 group()、findall 单独提取
text = "www.baidu.com"
pat = r"www\.(?:baidu|google)\.com"
七、核心易错点总结
- 1.
group(0) 是整体匹配,分组从 group(1) 开始 - 2. findall 遇到括号只返回分组内容,不要盲目加括号
- 3. re.sub 反向引用必须加 原始字符串 r"",防止转义失效
- 4. 大量重复匹配一定要用
re.compile() 优化性能 - 5. 普通分组
() 会捕获,不需要捕获用 (?:)
📌 本章快速背诵总结
- 2. group(n):获取第n个分组,groups() 返回全部分组元组
- 3. re.sub():正则批量替换,
\1 反向引用分组 - 4. re.compile():预编译正则,重复使用提升效率
- 5. 命名分组:
(?P<name>规则),按名字取值更清晰