python学习笔记——正则表达式
一、正则表达式是什么
正则表达式(Regular Expression)是一套字符串匹配规则语法,用来:
- 检测字符串是否符合格式(手机号、邮箱、账号密码校验)
- 从文本中提取指定内容
- 替换、分割字符串
- 批量处理文本、爬虫提取数据
Python 中专门用 re 内置模块 操作正则,使用时需要引入re库
import re
二、原始字符串 r"" 为什么必须用?
1
Python 里 \ 是转义字符,比如 \n 换行、\t 制表符。
正则里大量用到 \d \w \s 等,如果不用 r"" ,要写 \d 很麻烦。
r"正则内容",原始字符串,不做 Python 转义,直接给正则引擎
以后写正则一律用 r''。
三、正则基础元字符(必精通)
1. 匹配任意字符
. :匹配除换行符 \n 外任意一个字符
2. 开头结尾定位
^ :匹配字符串开头
$ :匹配字符串结尾
re.search(r'^abc', 'abc123') # 开头是abc,匹配成功
re.search(r'123$', 'abc123') # 结尾是123,匹配成功
3. 重复限定符(控制出现次数)
| 简写 | 等价 | 含义 |
|---|---|---|
| \d | [0-9] | 任意数字 |
| \D | [^0-9] | 非数字 |
| \w | [a-zA-Z0-9_] | 字母、数字、下划线 |
| \W | [^a-zA-Z0-9_] | 非单词字符 |
| \s | 空白符 | 空格、制表符、换行 |
| \S | 非空白符 | 除空白外所有字符 |
4. 字符集 []
[abc] :匹配 a /b/c 任意一个
[a-z] :小写字母
[A-Z] :大写字母
[0-9] :数字
[a-zA-Z0-9] :字母 + 数字
[^abc] :取反,匹配不是 a、b、c 的任意字符
5. 选择与分组
| :或,左右二选一,范围默认是整块表达式;
() :①划定规则范围,约束 | 和重复符作用整体;②捕获分组,单独提取括号内的匹配内容
四、预定义字符类(简写)
| 简写 | 等价 | 含义 |
|---|---|---|
| \d | [0-9] | 任意数字 |
| \D | [^0-9] | 非数字 |
| \w | [a-zA-Z0-9_] | 字母、数字、下划线 |
| \W | [^a-zA-Z0-9_] | 非单词字符 |
| \s | 空白符 | 空格、制表符、换行 |
| \S | 非空白符 | 除空白外所有字符 |
五、贪婪匹配 vs 非贪婪匹配
1. 贪婪(默认)
-
- {n,m} 默认尽可能多匹配
s = "<a>123</a><b>456</b>"
re.findall(r'<.*>', s)
# 结果:['<a>123</a><b>456</b>'] 一次性匹配到底
2. 非贪婪(加?)
格式:.*? +? {n,m}?
尽可能少匹配
re.findall(r'<.*?>', s)
# 结果:['<a>', '</a>', '<b>', '</b>']
考试、爬虫必记:提取标签、中间内容一律用 .*?
六、re 模块六大核心函数(超详细用法)
1. re.match()
规则:只从字符串开头匹配
匹配成功返回匹配对象,失败返回 None
res = re.match(r'hello', 'hello world')
2. re.search()
规则:整个字符串找第一个匹配
不限制开头,找到就停
res = re.search(r'world', 'hello world')
3. re.findall ()【最常用】
规则:找到所有匹配,返回列表
无分组返回整体匹配;有分组只返回分组内容
re.findall(r'\d+', 'a1b22c333')
# ['1','22','333']
4. re.sub () 替换
格式:re.sub(正则, 替换内容, 原字符串, 替换次数)
# 把所有数字换成 #
re.sub(r'\d+', '#', 'a1b22c333')
5. re.split () 分割
按正则规则分割字符串
# 按数字分割
re.split(r'\d+', 'abc123def456ghi')
6. re.finditer()
返回迭代器,适合匹配结果非常多的场景,节省内存
七、分组()高级用法
1. 普通分组提取
用 () 把要提取的内容括起来
s = "电话:13812345678"
res = re.search(r'电话:(\d+)', s)
print(res.group(1)) # 取出手机号
group(0) :匹配整体
group(1) :第 1 个分组
group(2) :第 2 个分组
2. 多分组
res = re.search(r'(\d+)-(\d+)', '2025-12-30')
print(res.group(1), res.group(2))
3. 命名分组(了解)
(?P<名字>正则),可以按名字取值
八、正则修饰符(flag)
常用第三个参数加修饰符:
re.I / re.IGNORECASE :忽略大小写
re.S / re.DOTALL :让 . 匹配换行符
re.M / re.MULTILINE :多行模式,^ $ 匹配每行开头结尾
re.search(r'abc', 'ABC', re.I)
| 函数 | 成功返回 | 失败 / 找不到返回 |
|---|---|---|
| re.match | Match 对象 | None |
| re.search | Match 对象 | None |
| re.findall | 列表(字符串 / 元组) | 空列表 [] |
| re.sub | 新字符串 | 原字符串 |
| re.split | 列表 | 含原串的单元素列表 |
| re.finditer | 迭代器 (含 Match 对象) | 空迭代器 |
| 函数 | 无分组返回值 | 单个分组 (...) | 多个分组 (...)(...) |
|---|---|---|---|
| re.match | 匹配成功:Match 对象失败:None | 仍返回 Match 对象可用 group(1) 取分组 | 仍返回 Match 对象可用 group(1) group(2) 分别取 |
| re.search | 匹配成功:Match 对象失败:None | 仍返回 Match 对象用 group(1) 取值 | 仍返回 Match 对象多分组按编号取 |
| re.findall | 字符串列表所有整体匹配结果 | 只返回分组内容列表抛弃整体匹配 | 元组列表每个元组包含所有分组内容 |
| re.finditer | 迭代器每项是 Match 对象 | 迭代器每项仍是 Match 对象 | 迭代器每项仍是 Match 对象 |
| re.sub | 返回替换后新字符串 | 可在替换式用 \1 引用分组 | 可用 \1 \2 引用多分组 |
| re.split | 分割后的字符串列表 | 保留分组匹配内容到列表中 | 同样保留所有分组匹配内容 |
\d → 预定义字符:匹配任意 1 个数字
{4} → 数量限定符:前面的规则恰好重复 4 次
() → 分组:把 \d{4} 整体括起来,变成一个捕获分组

浙公网安备 33010602011771号