当前位置: 代码网 > it编程>前端脚本>Python > 一文彻底搞定Python正则表达式(常用场景速查表)

一文彻底搞定Python正则表达式(常用场景速查表)

2026年08月20日 Python 我要评论
一、核心摘要你需要的是一份兼顾基础语法和实战场景的 python 正则表达式速查表,旨在帮你快速掌握正则的核心规则,解决字符串匹配、提取、替换、验证等高频问题。本文从 “基础语法&rarr

一、核心摘要

你需要的是一份兼顾基础语法实战场景的 python 正则表达式速查表,旨在帮你快速掌握正则的核心规则,解决字符串匹配、提取、替换、验证等高频问题。本文从 “基础语法→核心用法→场景速查→实战示例” 层层递进,所有示例均可直接运行,既适合新手快速上手,也可作为开发中的即查即用手册。

二、正则表达式核心基础(速记版)

1. 核心元字符(匹配单个字符)

元字符说明示例
.匹配任意单个字符(除换行\nr"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)从字符串开头匹配,返回匹配对象 / nonere.match(r"abc", "abc123") → 匹配对象;re.match(r"abc", "123abc") → none
re.search(pat, str)扫描整串,返回第一个匹配对象 / nonere.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}")

六、避坑要点

  1. 原始字符串:正则表达式推荐用r""(原始字符串),避免\双重转义(如r"\d" 而非 \\d);
  2. 贪婪 vs 非贪婪:默认量词是贪婪的(优先匹配最多),加?改为非贪婪(如r"a+?");
  3. match vs searchmatch只匹配开头,验证整串用match + ^$;提取内容用search/findall
  4. 分组与 findallfindall遇到分组会优先返回分组内容,如需整串匹配,用非捕获分组(?:...)
  5. 中文匹配:中文范围是[\u4e00-\u9fa5],需确保字符串编码为 utf-8。

七、总结

关键点回顾

  1. 正则核心:元字符(匹配单个字符)+ 量词(匹配次数)+ 分组(整合逻辑),优先用原始字符串r""编写;
  2. re 模块高频用法:match(开头验证)、findall(提取所有)、sub(替换 / 清洗)、compile(重复调用优化);
  3. 高频场景:手机号 / 邮箱验证、数字 / 价格提取、文本脱敏,直接复用速查表中的正则即可。

这份速查表覆盖了 python 正则 90% 以上的高频场景,开发中可直接复制对应正则表达式,新手建议先掌握基础语法和 1-2 个实战示例,再逐步拓展复杂场景。

到此这篇关于python正则表达式常用场景速查表的文章就介绍到这了,更多相关python正则场景速查表内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com