Python 正则表达式操作速查表(全面版·v1.1 - 2025年11月12日修订)
📌 使用说明
时间复杂度:O(n) = 线性级(随字符串长度增长),O(n×k) = 取决于字符串长度与模式复杂度
🔴 正则匹配默认区分大小写,需通过 flags 显式指定忽略大小写
🔵 所有匹配操作返回 None 表示匹配失败,返回 Match 对象表示成功
⚠️ 通用警告:复杂正则可能存在性能问题,避免过度使用贪婪匹配;处理HTML/XML建议用专用解析库
一、正则核心概念总览表
二、正则表达式基础语法
| 语法分类 | 具体语法 | 功能描述 | 示例 |
|---|---|---|---|
| 字符匹配 | . | 匹配除换行符 \n 外的任意字符 | "a.c" 匹配 "abc"、"a1c" |
| \w | 匹配单词字符([a-zA-Z0-9_],默认含Unicode) | "\w+" 匹配 "python_3" | |
| \W | 匹配非单词字符(与 \w 相反) | "\W" 匹配 "!"、"@"、"," | |
| \d | 匹配数字([0-9]) | "\d{3}" 匹配 "123" | |
| \D | 匹配非数字(与 \d 相反) | "\D" 匹配 "a"、"?" | |
| \s | 匹配空白字符(空格/制表符\t/换行符\n等) | "\s+" 匹配 " \t\n" | |
| \S | 匹配非空白字符(与 \s 相反) | "\S" 匹配 "a"、"1"、"!" | |
| 字符集 | [abc] | 匹配 a、b、c 中的任意一个字符 | "[abc]" 匹配 "a"、"b" |
| [^abc] | 匹配除 a、b、c 外的任意字符 | "[^abc]" 匹配 "d"、"1" | |
| [a-z] | 匹配 a 到 z 之间的任意小写字母 | "[a-z]" 匹配 "x"、"y" | |
| [0-9A-Z] | 匹配数字或大写字母 | "[0-9A-Z]" 匹配 "5"、"B" | |
| 数量限定 | * | 匹配前面元素 0 次或多次(贪婪模式) | "ab*" 匹配 "a"、"ab"、"abb" |
| + | 匹配前面元素 1 次或多次(贪婪模式) | "ab+" 匹配 "ab"、"abb" | |
| ? | 匹配前面元素 0 次或 1 次(贪婪模式) | "ab?" 匹配 "a"、"ab" | |
| 匹配前面元素恰好 n 次 | "a{3}" 匹配 "aaa" | ||
| 匹配前面元素至少 n 次(贪婪模式) | "a{2,}" 匹配 "aa"、"aaa" | ||
| 匹配前面元素 n 到 m 次(贪婪模式) | "a{1,3}" 匹配 "a"、"aa" | ||
| 非贪婪模式 | *? / +? / ?? / {n,m}? | 尽可能少地匹配(与贪婪模式相反) | "a.*?b" 匹配 "aab" 中的 "aab" |
| 位置匹配 | ^ | 匹配字符串开头(多行模式匹配行首) | "^hello" 匹配 "hello world" |
| $ | 匹配字符串结尾(多行模式匹配行尾) | "world$" 匹配 "hello world" | |
| \b | 匹配单词边界(\w 与 \W 交界处) | "\bcat\b" 匹配 "cat" 不匹配 "category" | |
| \B | 匹配非单词边界(与 \b 相反) | "\Bcat\B" 匹配 "category" 中的 "cat" | |
| 逻辑关系 | | | 匹配左右任意一个模式(优先级低,建议用()包裹) | "a|b" 匹配 "a" 或 "b" |
| 分组捕获 | (pattern) | 定义分组,可通过 group(n) 提取 | "(\d+)-(\d+)" 匹配 "123-456" |
| (?:pattern) | 定义分组但不捕获(节省内存) | "(?:a|b)c" 匹配 "ac" 或 "bc" | |
| \n | 引用第 n 个分组的匹配结果(n≥1) | "(ab)\1" 匹配 "abab" | |
| 命名分组 | (?P |
给分组命名,便于通过名称提取 | "(?P |
三、正则编译与匹配函数
| 函数类型 | 具体函数 | 语法示例 | 功能描述 | 时间复杂度 | 注意事项 |
|---|---|---|---|---|---|
| 编译函数 | re.compile() | re.compile(pattern, flags=0) | 编译正则模式为 Pattern 对象,可重复使用 | O(1)(编译阶段) | 预编译提升重复匹配效率 |
| 匹配函数 | re.match() | re.match(pattern, string, flags=0) | 从字符串起始位置匹配,返回 Match 对象或 None | O(n×k) | 仅匹配开头,等价于 pattern.match() |
| 匹配函数 | re.search() | re.search(pattern, string, flags=0) | 搜索字符串任意位置的第一个匹配 | O(n×k) | 找到即返回,不继续搜索 |
| 查找函数 | re.findall() | re.findall(pattern, string, flags=0) | 查找所有非重叠匹配,返回列表 | O(n×k) | 有分组时返回分组内容列表 |
| 查找函数 | re.finditer() | re.finditer(pattern, string, flags=0) | 查找所有非重叠匹配,返回 Match 对象迭代器 | O(n×k) | 适合大量结果,节省内存 |
| 替换函数 | re.sub() | re.sub(pattern, repl, string, count=0) | 替换所有匹配,返回新字符串 | O(n×k) | repl 可为字符串或函数 |
| 替换函数 | re.subn() | re.subn(pattern, repl, string, count=0) | 替换所有匹配,返回 (新字符串, 替换次数) | O(n×k) | 需获取替换次数时使用 |
| 分割函数 | re.split() | re.split(pattern, string, maxsplit=0) | 按匹配结果分割字符串,返回列表 | O(n×k) | maxsplit 限制分割次数 |
| 全匹配函数 | re.fullmatch() | re.fullmatch(pattern, string, flags=0) | 整个字符串必须完全匹配模式 | O(n×k) | 等价于 ^pattern$ 匹配 |
四、Pattern 对象方法(编译后)
| 方法类型 | 具体方法 | 语法示例 | 功能描述 | 时间复杂度 | 注意事项 |
|---|---|---|---|---|---|
| 匹配方法 | match() | pattern.match(string, pos=0, endpos=None) | 从指定位置 pos 开始匹配(默认0) | O(n×k) | endpos 限制匹配结束位置 |
| 搜索方法 | search() | pattern.search(string, pos=0, endpos=None) | 从 pos 开始搜索第一个匹配 | O(n×k) | 同 re.search() 但支持位置参数 |
| 查找方法 | findall() | pattern.findall(string, pos=0, endpos=None) | 从 pos 开始查找所有匹配 | O(n×k) | 支持范围限制 |
| 查找方法 | finditer() | pattern.finditer(string, pos=0, endpos=None) | 从 pos 开始返回匹配迭代器 | O(n×k) | 支持范围限制 |
| 替换方法 | sub() | pattern.sub(repl, string, count=0) | 同 re.sub(),使用预编译模式 | O(n×k) | 效率高于 re.sub() |
| 分割方法 | split() | pattern.split(string, maxsplit=0) | 同 re.split(),使用预编译模式 | O(n×k) | 效率高于 re.split() |
五、Match 对象方法(匹配成功后)
| 方法类型 | 具体方法 | 语法示例 | 功能描述 | 时间复杂度 | 注意事项 |
|---|---|---|---|---|---|
| 分组提取 | group() | match.group([n1, n2, ...]) | 返回指定分组内容(0为整个匹配,无参默认0) | O(1) | 多参数返回元组,组号从1开始 |
| 分组提取 | groups() | match.groups(default=None) | 返回所有分组组成的元组 | O(1) | default 为未匹配分组的默认值 |
| 分组提取 | groupdict() | match.groupdict(default=None) | 返回命名分组的字典(键为组名,值为内容) | O(1) | 需正则中用 (?P |
| 位置信息 | start() | match.start([group=0]) | 返回指定分组的起始索引 | O(1) | 无分组参数时返回整个匹配的起始位置 |
| 位置信息 | end() | match.end([group=0]) | 返回指定分组的结束索引(不包含) | O(1) | 区间为 [start, end) |
| 位置信息 | span() | match.span([group=0]) | 返回指定分组的 (start, end) 元组 | O(1) | 用于定位匹配位置 |
| 扩展方法 | expand() | match.expand(template) | 用匹配结果替换模板中的 \n 引用 | O(k) | 模板中 \1 引用组1,\g |
六、常用 flags 标志位
| 标志常量 | 简写 | 功能描述 | 适用场景 |
|---|---|---|---|
| re.IGNORECASE | re.I | 忽略大小写匹配 | 不区分大小写的文本搜索 |
| re.MULTILINE | re.M | 多行模式,^ 匹配行首、$ 匹配行尾 | 处理多行文本(日志、代码) |
| re.DOTALL | re.S | . 匹配包括换行符 \n 在内的所有字符 | 匹配跨多行的文本块 |
| re.VERBOSE | re.X | 允许正则换行和注释(忽略空白和 # 注释) | 编写复杂正则提高可读性 |
| re.ASCII | - | 限制 \w/\d/\s 等元字符为 ASCII 范围 | 仅需匹配英文/数字的场景 |
| re.UNICODE | re.U | \w/\d/\s 等元字符支持 Unicode(Python3默认) | 处理中文、日文等多语言文本 |
| 组合标志 | - | 用 | 连接多个标志(如 re.I | re.M) |
七、常见正则示例
| 应用场景 | 正则表达式 | 说明 |
|---|---|---|
| 邮箱验证 | [1]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+$ | 匹配标准邮箱格式 |
| 手机号验证 | ^1[3-9]\d{9}$ | 匹配中国大陆手机号(11位,以13-19开头) |
| URL提取 | https?😕/[^\s]+ | 匹配 http/https 开头的URL |
| HTML标签提取 | <[^<]*?> | 匹配简单HTML标签(非贪婪模式) |
| 提取数字 | -?\d+.?\d* | 匹配整数、小数、负数 |
| 去除空白字符 | \s+ | 匹配连续空白,用于替换为单个空格 |
| 用户名验证 | [2]{4,16}$ | 4-16位字母、数字或下划线 |
通过上述速查表,可快速查询正则表达式的语法、函数及最佳实践,结合具体场景灵活组合使用能高效处理文本匹配与提取任务。
a-zA-Z0-9_.+- ↩︎
a-zA-Z0-9_ ↩︎