当前位置:首页>python>Python 正则进阶详解

Python 正则进阶详解

  • 2026-10-11 08:32:10
Python 正则进阶详解

一、分组捕获 ()核心作用

1. 什么是分组

在正则中,用小括号 () 包裹一部分规则,就是分组 / 捕获组。
作用:

  1. 1. 把整体规则拆分成多个局部,单独提取指定内容
  2. 2. 结合 group() 精准取值
  3. 3. 替换时反向引用分组内容
  4. 4. 简化复杂正则结构

2. 基础语法

import re
text = "姓名:小明,年龄:18"
# 两个捕获组
pattern = r"姓名:(\w+),年龄:(\d+)"
res = re.search(pattern, text)

二、re.group() 获取分组内容

1. group() 用法

  • • group() / group(0):获取整体全部匹配内容
  • • group(1):获取第1个分组
  • • group(2):获取第2个分组
  • • 支持多个分组依次取值

完整示例

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 中分组的特殊规则(高频易错)

  1. 1. 无分组:返回整体匹配列表
  2. 2. 单个分组:只返回「分组内」内容
  3. 3. 多个分组:返回 元组列表
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)
  • • 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. 作用

  1. 1. 将正则规则提前编译成正则对象
  2. 2. 重复多次使用同一正则时,提高运行效率
  3. 3. 代码更整洁,便于统一管理正则

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. 1. group(0) 是整体匹配,分组从 group(1) 开始
  2. 2. findall 遇到括号只返回分组内容,不要盲目加括号
  3. 3. re.sub 反向引用必须加 原始字符串 r"",防止转义失效
  4. 4. 大量重复匹配一定要用 re.compile() 优化性能
  5. 5. 普通分组 () 会捕获,不需要捕获用 (?:)

📌 本章快速背诵总结

  1. 1. 分组 ():捕获局部内容,支持单独提取
  2. 2. group(n):获取第n个分组,groups() 返回全部分组元组
  3. 3. re.sub():正则批量替换,\1 反向引用分组
  4. 4. re.compile():预编译正则,重复使用提升效率
  5. 5. 命名分组:(?P<name>规则),按名字取值更清晰

最新文章

随机文章