正则表达式语法

正则表达式语法

2026年9月19日·#编程学习/python学习笔记Python/正则表达式·995 字 5 分钟
浏览量加载中...
AI 摘要

正则表达式的字符类(\d \w \s 等)、量词(* + ? {})、分组与锚点(^ $),以及分组提取日期

两张表记住正则语法#

字符类:匹配”什么”#

表达式描述
普通字符字母、数字、汉字及大多数字符,直接匹配自身
.匹配任意一个字符(除 \n)
\d匹配数字 0-9
\D匹配数字
\w匹配单词字符,即 a-z、A-Z、0-9、_(默认还含其它语言字符)
\W匹配非单词字符
\s匹配空白字符,即空格、\t
\S匹配非空白字符
[38]字符集:匹配 3 或 8
[^38]反向字符集:匹配 3、8
[3-9]范围:匹配 3 到 9

量词与定位:匹配”几次”、“在哪”#

表达式描述
*出现任意次(0 次或无数次)
+至少出现 1 次
?至多出现一次(0 次或 1 次)
{m}出现 m 次
{m,}至少出现 m 次
{m,n}出现 m 到 n 次
``
()将括号中的字符作为一个分组
^匹配字符串开头
$匹配字符串结尾
Tip

同一个手机号规则可以有多种写法,严格程度不同:1[3-9]\d*(后面随便几位)→ 1[3-9]\d{9}(正好 9 位)→ ^1[3-9]\d{9}$整串必须是一个手机号)。

实战示例#

import re
s1 = "18809090000是我的手机号,188开头的;我的另一个手机号是15500008888,两个QQ号分别是1259989092和13809091293821,邮箱为python666@163.com,请给我发邮件。"
print(re.findall(r"188\d{8}", s1)) # {8} 正好 8 位数字
print(re.findall(r"155\d{6,10}", s1)) # 6 到 10 位
print(re.findall(r"1[38]\d{8}", s1)) # 第二位是 3 或 8
print(re.findall(r"1[3-9]\d{8}", s1)) # 第二位是 3 到 9
print(re.findall(r"^1[3-9]\d{9}$", s1)) # 整串必须是一个手机号 → 匹配不到
print(re.findall(r"\w+@\w+\.\w+", s1)) # 提取邮箱

分组:findall 会返回元组#

给正则的一部分加 ()findall 返回的就不再是整串,而是每个分组各占一个位置的元组

s2 = "现在的时间是2026-02-06 10:05:25, 今天的天气还可以"
print(re.findall(r"\d{4}-\d{2}-\d{2}", s2)) # ['2026-02-06'] 整串
print(re.findall(r"(\d{4})-(\d{2})-(\d{2})", s2)) # [('2026', '02', '06')] 分组
Note

\w 默认会匹配中文等”其它语言字符”。只要英文数字时加第三个参数 re.ASCIIre.findall(r"\w+", s, re.ASCII)

相关#

练习题#

一、回忆填空(写完再展开对答案)#

  1. . 匹配任意一个字符(除 ____)
  2. \d 匹配 ____;\D 匹配 ____;\w 匹配 ____
  3. \s 匹配空白字符,即空格和 ____
  4. * 出现任意次;+ 至少 ____ 次;? 至多出现 ____ 次
  5. {m,n} 表示出现 ____ 到 ____ 次
  6. | 表示 ____;() 表示将括号中的字符作为一个 ____
  7. ^ 匹配字符串 ____;$ 匹配字符串 ____
  8. [^38] 匹配 ____;[3-9] 匹配 ____
  9. 给分组加括号后,findall 返回的每个元素是一个 ____
填空答案(做完再点开)
  1. \n 2. 数字 0-9 / 非数字 / 单词字符(a-z、A-Z、0-9、_) 3. \t 4. 1 / 1(0 或 1) 5. m、n 6. 或 / 分组 7. 开头 / 结尾 8. 非 3 非 8 / 3 到 9 9. 元组

二、裸写题#

文本:s = "现在的时间是2026-02-06 10:05:25, 今天的天气还可以, 气温是28度"

  • 2-1 提取日期 提取文本中的日期(形如 2026-02-06)。

    提示(先自己想,实在想不出再点开)

    一级 · 思路:4 位数字-2 位-2 位的固定模式 二级 · 方法re.findall(r"\d{4}-\d{2}-\d{2}", s) 三级 · 骨架{4}{2} 都是量词

  • 2-2 分组提取年月日 让 findall 直接返回 [('2026', '02', '06')] 这种形式。

    提示

    一级 · 思路:给要单独拿出来的部分加括号 二级 · 方法r"(\d{4})-(\d{2})-(\d{2})" 三级 · 骨架:返回的是元组列表,可以再解包

  • 2-3 提取邮箱s3 = "联系我:python666@163.com 或 support@itcast.cn" 中提取两个邮箱。

    提示

    一级 · 思路:邮箱 = 单词字符 @ 单词字符 . 单词字符 二级 · 方法\w+@\w+\.\w+ 三级 · 骨架. 前面要加 \ 转义(. 表示真正的点)

参考答案(做完再点开)
import re
s = "现在的时间是2026-02-06 10:05:25, 今天的天气还可以, 气温是28度"
# 2-1
print(re.findall(r"\d{4}-\d{2}-\d{2}", s)) # ['2026-02-06']
# 2-2(分组后返回元组)
print(re.findall(r"(\d{4})-(\d{2})-(\d{2})", s)) # [('2026', '02', '06')]
year, month, day = re.findall(r"(\d{4})-(\d{2})-(\d{2})", s)[0]
print(year, month, day)
# 2-3
s3 = "联系我:python666@163.com 或 support@itcast.cn"
print(re.findall(r"\w+@\w+\.\w+", s3)) # ['python666@163.com', 'support@itcast.cn']

评论区

[ 标签 ]
# AI37# AI 编程2# AI工具1# Ajax2# Apifox1# AstrBot3# Astro2# CC Switch1# CDN2# Claude Code1# claudecode2# ClaudeCode1# Cloudflare2# CloudFlare2# CloudFlare-ImgBed3# coc3# CSS6# DeepSeek6# deepseek2# DELETE1# Docker1# EdgeOne3# Gist1# git1# GitHub1# hexo-circle-of-friends1# HTML6# HTTP5# ImageManager1# Java23# java13# JavaScript5# JDBC3# JSON2# JUnit1# LangChain25# Logback1# Maven6# Muse Spark1# Mybatis1# MyBatis4# MySQL28# MySql1# NapCat1# Node.js1# obsidian2# Obsidian5# OpenCode4# ORM1# PathVariable1# PicGo1# PyCharm1# Python65# RequestBody1# RequestMapping1# RESTful风格1# skills1# Slf4j1# SpringBoot11# SQL2# Streamlit5# Svelte2# TailwindCSS1# Telegram3# Tlias2# Vercel1# vscode2# Vue7# Waline3# WebDAV1# Web基础6# Web开发6# WinSCP1# YAML1# 三层架构1# 中二宣言1# 书籍1# 使用文档10# 写作1# 函数2# 刷步数1# 前端32# 动态1# 动漫1# 包1# 单词2# 博客7# 博客工作流1# 博客开发2# 参数接收1# 友链1# 反思2# 图床6# 地图1# 备份2# 大模型1# 奇思妙想1# 存储1# 学习方法6# 学校1# 宝塔面板3# 宝宝10# 对象1# 导航栏1# 工具2# 开发1# 开发工具1# 开发规范1# 开心1# 异常处理1# 影视2# 微信1# 性能优化2# 总结1# 想法15# 感受1# 感悟11# 指南1# 提示词工程1# 插件5# 故障排除1# 效率工具2# 教程10# 数据分析9# 数据库27# 数据结构1# 文件操作2# 斩神1# 日常92# 日志框架1# 朋友圈1# 朱元璋1# 模块1# 模板1# 正则表达式2# 测试1# 游戏2# 爬虫7# 生活迁移1# 电影2# 电脑1# 碎碎念1# 视觉识别1# 类1# 类型注解1# 网络基础2# 网络教室1# 羊毛2# 脚本2# 脚本工具1# 自动化2# 蓝奏云1# 订阅推荐2# 记录2# 评论系统1# 词根1# 词缀1# 说说1# 足迹1# 跑步2# 路径参数1# 转载2# 运动1# 部落冲突1# 配置1# 随机图1# 面向对象5# 音乐3# 音标1# 饮食1# 驼峰命名1# 高德地图1
[ 公告 ]

如果你喜欢,那么欢迎来到我的世界!

了解更多
[ 音乐 ]
封面

音乐

暂未播放

0:000:00
暂无歌词
找不到相关结果。
[ contents ]
[ 全部文章 ]