一文彻底搞定Python正则表达式(常用场景速查表)
一、核心摘要你需要的是一份兼顾基础语法和实战场景的 python 正则表达式速查表,旨在帮你快速掌握正则的核心规则,解决字符串匹配、提取、替换、验证等高频问题。本文从 “基础语法&rarr
一、核心摘要
你需要的是一份兼顾基础语法和实战场景的 python 正则表达式速查表,旨在帮你快速掌握正则的核心规则,解决字符串匹配、提取、替换、验证等高频问题。本文从 “基础语法→核心用法→场景速查→实战示例” 层层递进,所有示例均可直接运行,既适合新手快速上手,也可作为开发中的即查即用手册。
二、正则表达式核心基础(速记版)
1. 核心元字符(匹配单个字符)
| 元字符 | 说明 | 示例 |
|---|
. | 匹配任意单个字符(除换行\n) | r"a.b" 匹配 "a1b"、"a*b",不匹配 "ab" |
\d | 匹配数字(0-9) | r"\d" 匹配 "5",不匹配 "a" |
\d | 匹配非数字 | r"\d" 匹配 "a",不匹配 "5" |
\w | 匹配字母 / 数字 / 下划线([a-za-z0-9_]) | r"\w" 匹配 "a"、"8"、"_" |
\w | 匹配非字母 / 数字 / 下划线 | r"\w" 匹配 "@"、"%" |
\s | 匹配空白字符(空格 / 制表符\t/ 换行\n等) | r"\s" 匹配 ""、"\t" |
\s | 匹配非空白字符 | r"\s" 匹配 "a"、"5" |
[] | 字符集,匹配其中任意一个字符 | r"[abc]" 匹配 "a"/"b"/"c";r"[0-9]" 等价于 \d |
[^] | 否定字符集,匹配不在其中的字符 | r"[^abc]" 匹配除 a/b/c 外的字符 |
^ | 匹配字符串开头 | r"^abc" 匹配 "abc123",不匹配 "123abc" |
$ | 匹配字符串结尾 | r"abc$" 匹配 "123abc",不匹配 "abc123" |
| | 或,匹配左侧 / 右侧表达式 | r"abc|def" 匹配 "abc" 或 "def" |
2. 量词(匹配重复次数)
| 量词 | 说明 | 示例 |
|---|
* | 匹配前面字符 0 次 / 多次(贪婪) | r"a*" 匹配 ""、"a"、"aaa" |
+ | 匹配前面字符 1 次 / 多次(贪婪) | r"a+" 匹配 "a"、"aaa",不匹配 "" |
? | 匹配前面字符 0 次 / 1 次(非贪婪) | r"a?" 匹配 ""、"a" |
{n} | 匹配前面字符恰好 n 次 | r"a{3}" 匹配 "aaa",不匹配 "aa" |
{n,} | 匹配前面字符至少 n 次 | r"a{2,}" 匹配 "aa"、"aaa" |
{n,m} | 匹配前面字符 n 到 m 次 | r"a{2,4}" 匹配 "aa"、"aaa"、"aaaa" |
*?/+?/{n,m}? | 非贪婪匹配(优先最少次数) | r"a+?" 匹配 "aa" 时只取第一个 "a" |
3. 分组与引用
| 语法 | 说明 | 示例 |
|---|
() | 分组,将括号内作为整体 | r"(ab)+" 匹配 "ab"、"abab" |
\1-\9 | 引用第 n 个分组内容 | r"(\d{3})-\1" 匹配 "123-123" |
(?p<name>) | 命名分组 | r"(?p<phone>\d{11})" 给 11 位数字命名为 phone |
(?p=name) | 引用命名分组 | r"(?p<num>\d{2})-(?p=num)" 匹配 "12-12" |
三、python re 模块核心用法(速用版)
所有示例需先导入:import re
| 函数 | 功能 | 示例 |
|---|
re.match(pat, str) | 从字符串开头匹配,返回匹配对象 / none | re.match(r"abc", "abc123") → 匹配对象;re.match(r"abc", "123abc") → none |
re.search(pat, str) | 扫描整串,返回第一个匹配对象 / none | re.search(r"abc", "123abc456") → 匹配对象 |
re.findall(pat, str) | 查找所有匹配项,返回列表 | re.findall(r"\d+", "a123b456") → ["123", "456"] |
re.sub(pat, repl, str, count=0) | 替换匹配内容(count=0 = 全部替换) | re.sub(r"\d", "*", "a1b2c3") → "abc*" |
re.split(pat, str, maxsplit=0) | 按匹配项分割字符串 | re.split(r"\s+", "a b\tc") → ["a", "b", "c"] |
re.compile(pat) | 编译正则(重复使用提升效率) | pat = re.compile(r"\d+"); pat.findall("a123b456") → ["123", "456"] |
匹配对象核心方法
group() / group(0):返回整个匹配内容group(n):返回第 n 个分组内容group("name"):返回命名分组内容span():返回匹配内容的起止索引(元组)
四、常用场景速查表(即查即用)
1. 数据验证类(整串匹配)
| 场景 | 正则表达式 | python 示例 |
|---|
| 手机号(中国大陆) | r"^1[3-9]\d{9}$" | re.match(r"^1[3-9]\d{9}$", "13812345678") → 匹配 |
| 邮箱 | r"^[a-za-z0-9_-]+@[a-za-z0-9_-]+(\.[a-za-z0-9_-]+)+$" | re.match(r"^[a-za-z0-9_-]+@[a-za-z0-9_-]+(\.[a-za-z0-9_-]+)+$", "test@163.com") → 匹配 |
| 身份证号(18 位) | r"^\d{17}[\dxx]$" | re.match(r"^\d{17}[\dxx]$", "11010119900307789x") → 匹配 |
| url(http/https) | r"^https?://[^\s]+$" | re.match(r"^https?://[^\s]+$", "https://www.baidu.com") → 匹配 |
| 纯数字字符串 | r"^\d+$" | re.match(r"^\d+$", "123456") → 匹配 |
2. 数据提取类(混在文本中)
| 场景 | 正则表达式 | python 示例 |
|---|
| 提取所有数字 | r"\d+" | re.findall(r"\d+", "价格:99元,库存:1000件") → ["99", "1000"] |
| 提取所有中文 | r"[\u4e00-\u9fa5]+" | re.findall(r"[\u4e00-\u9fa5]+", "python正则表达式入门") → ["正则表达式入门"] |
| 提取手机号 | r"1[3-9]\d{9}" | re.findall(r"1[3-9]\d{9}", "电话:13812345678,备用:13998765432") → ["13812345678", "13998765432"] |
| 提取价格(带 ¥/ 元) | r"¥?\d+\.?\d*" | re.findall(r"¥?\d+\.?\d*", "售价:¥99.9元,原价:129元") → ["¥99.9", "129"] |
3. 数据清洗 / 替换类
| 场景 | 正则表达式 | python 示例 |
|---|
| 手机号脱敏(中间 4 位 *) | r"(1[3-9]\d)(\d{4})(\d{4})" | re.sub(r"(1[3-9]\d)(\d{4})(\d{4})", r"\1****\3", "13812345678") → "138****5678" |
| 去除所有空白 | r"\s+" | re.sub(r"\s+", "", "a b\tc\nd") → "abcd" |
| 数字替换为 * | r"\d" | re.sub(r"\d", "*", "订单号:123456") → "订单号:******" |
| 邮箱脱敏(@前保留 2 位) | r"([a-za-z0-9_-]{2})[a-za-z0-9_-]*(@.*)" | re.sub(r"([a-za-z0-9_-]{2})[a-za-z0-9_-]*(@.*)", r"\1****\2", "test123@163.com") → "te****@163.com" |
五、实战示例(完整可运行)
示例 1:验证手机号合法性
import re
def is_valid_phone(phone):
"""验证中国大陆手机号"""
pattern = r"^1[3-9]\d{9}$"
return bool(re.match(pattern, phone))
# 测试
print(is_valid_phone("13812345678")) # true
print(is_valid_phone("12812345678")) # false(开头非13-19)
print(is_valid_phone("138123456789")) # false(长度超11)
示例 2:提取文本中所有价格并求和
import re
text = "商品a:¥99.9元,商品b:129元,商品c:88.5元"
# 提取价格(捕获数字部分,去掉¥/元)
price_pattern = r"¥?(\d+\.?\d*)"
prices = re.findall(price_pattern, text)
# 转浮点数并求和
prices = [float(p) for p in prices]
total = sum(prices)
print(f"提取的价格列表:{prices}") # [99.9, 129.0, 88.5]
print(f"总价:{total}元") # 317.4元
示例 3:批量脱敏文本中的手机号和邮箱
import re
text = """
联系电话:13812345678,备用:13998765432
邮箱:test123456@163.com,备用:abcdefg@qq.com
"""
# 1. 手机号脱敏
text = re.sub(r"(1[3-9]\d)(\d{4})(\d{4})", r"\1****\3", text)
# 2. 邮箱脱敏
text = re.sub(r"([a-za-z0-9_-]{2})[a-za-z0-9_-]*(@.*)", r"\1****\2", text)
print(text)
# 输出:
# 联系电话:138****5678,备用:139****5432
# 邮箱:te****@163.com,备用:ab****@qq.com
示例 4:编译正则提升重复调用效率
import re
# 编译正则(重复使用时推荐)
phone_pat = re.compile(r"1[3-9]\d{9}")
email_pat = re.compile(r"[a-za-z0-9_-]+@[a-za-z0-9_-]+(\.[a-za-z0-9_-]+)+")
# 批量处理文本
text_list = [
"电话:13812345678,邮箱:test@163.com",
"电话:13998765432,邮箱:abc@qq.com"
]
for text in text_list:
phones = phone_pat.findall(text)
emails = email_pat.findall(text)
print(f"手机号:{phones},邮箱:{emails}")
六、避坑要点
- 原始字符串:正则表达式推荐用
r""(原始字符串),避免\双重转义(如r"\d" 而非 \\d); - 贪婪 vs 非贪婪:默认量词是贪婪的(优先匹配最多),加
?改为非贪婪(如r"a+?"); - match vs search:
match只匹配开头,验证整串用match + ^$;提取内容用search/findall; - 分组与 findall:
findall遇到分组会优先返回分组内容,如需整串匹配,用非捕获分组(?:...); - 中文匹配:中文范围是
[\u4e00-\u9fa5],需确保字符串编码为 utf-8。
七、总结
关键点回顾
- 正则核心:元字符(匹配单个字符)+ 量词(匹配次数)+ 分组(整合逻辑),优先用原始字符串
r""编写; - re 模块高频用法:
match(开头验证)、findall(提取所有)、sub(替换 / 清洗)、compile(重复调用优化); - 高频场景:手机号 / 邮箱验证、数字 / 价格提取、文本脱敏,直接复用速查表中的正则即可。
这份速查表覆盖了 python 正则 90% 以上的高频场景,开发中可直接复制对应正则表达式,新手建议先掌握基础语法和 1-2 个实战示例,再逐步拓展复杂场景。
到此这篇关于python正则表达式常用场景速查表的文章就介绍到这了,更多相关python正则场景速查表内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
相关文章:
-
-
-
在python中,列表(list)是一种用于存储元素的有序集合,支持索引、切片、增加、删除和排序等操作。下面将详细介绍如何从索引到增删排序系统地理解和操作python列表。1.列表…
-
-
-
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论