python学习笔记——正则表达式

一、正则表达式是什么

正则表达式(Regular Expression)是一套字符串匹配规则语法,用来:

  1. 检测字符串是否符合格式(手机号、邮箱、账号密码校验)
  2. 从文本中提取指定内容
  3. 替换、分割字符串
  4. 批量处理文本、爬虫提取数据
    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} 整体括起来,变成一个捕获分组

posted @ 2026-05-11 20:57  RReally  阅读(14)  评论(0)    收藏  举报
//一下两个链接最好自己保存下来,再上传到自己的博客园的“文件”选项中