第 38 课 · 阶段七 · 进阶主题

正则表达式

正则表达式是文本处理的“万能钥匙”:匹配、查找、替换、提取。这一课掌握 re 模块的核心 API 与常用元字符。

第 38 课阶段七 · 进阶主题难度:进阶建议时长:45 分钟关键词:re · 元字符 · 分组 · 匹配

🎯 学完本课你将掌握

  • 理解正则表达式的作用
  • 掌握常用元字符与字符类
  • 熟练使用 re.match/findall/search/sub

一、什么是正则表达式

正则表达式(regex)是一套描述“字符串模式”的语言。比如提取所有手机号、校验邮箱格式、清洗脏数据,都可以用它完成。

二、常用元字符

元字符含义示例
.任意单个字符a.c 匹配 abc
\d数字 0-9\d\d 匹配两位数字
\w字母数字下划线\w+ 匹配单词
\s空白(空格/换行/Tab)a\sb
^开头^abc 以abc开头
$结尾abc$ 以abc结尾
*0次或多次ab* 匹配 a、ab、abb
+1次或多次ab+ 匹配 ab、abb
?0次或1次ab? 匹配 a、ab
{n}恰好n次\d{3} 三位数字

三、re 模块四大方法

re 入门.py
1import re
2
3text = "我的电话是 138-1234-5678,备用 139-0000-1111"
4
5# 1. re.findall:找出所有匹配
6phones = re.findall(r"\d{3}-\d{4}-\d{4}", text)
7print(phones) # ['138-1234-5678', '139-0000-1111']
8
9# 2. re.search:找第一个匹配(返回对象)
10m = re.search(r"\d{3}-\d{4}-\d{4}", text)
11print(m.group()) # 138-1234-5678
12
13# 3. re.match:从开头匹配
14print(re.match(r"\d", "abc123")) # None(开头不是数字)
15print(re.match(r"\d", "123abc").group()) # 1
16
17# 4. re.sub:替换
18new = re.sub(r"\d{4}-\d{4}", "****-****", text)
19print(new)
✅ 要点
写正则时在字符串前加 r(原始字符串),避免 \\ 转义地狱。

四、字符类与分组

字符类分组.py
1import re
2# 字符类 [ ]:匹配其中任意一个
3print(re.findall(r"[abc]", "a1b2c3")) # ['a','b','c']
4print(re.findall(r"[0-9]", "a1b2c3")) # ['1','2','3']
5
6# 分组 ( ):提取部分内容
7m = re.search(r"(\d{3})-(\d{4})", "电话 138-1234")
8print(m.group(0)) # 138-1234 整体
9print(m.group(1)) # 138 第一组
10print(m.group(2)) # 1234 第二组

五、实战:校验邮箱格式

邮箱校验.py
1import re
2
3def check_email(email):
4 pattern = r"^[\w.-]+@[\w-]+\.[\w.]+$"
5 return bool(re.match(pattern, email))
6
7print(check_email("user@example.com")) # True
8print(check_email("bad@@mail")) # False
9print(check_email("user name@x.com")) # False(有空格)

六、惰性匹配与贪婪匹配

默认 * 和 + 是贪婪的(尽可能多匹配);加 ? 变惰性(尽可能少匹配)。

贪婪 vs 惰性.py
1import re
2text = "<b>加粗</b>和<b>再粗</b>"
3print(re.findall(r"<b>.*</b>", text)) # 贪婪:['<b>加粗</b>和<b>再粗</b>']
4print(re.findall(r"<b>.*?</b>", text)) # 惰性:['<b>加粗</b>', '<b>再粗</b>']

七、常见错误与解决

常见错误与解决

错误现象原因 / 解决方法
匹配不到任何内容先确认元字符含义;可用在线正则测试工具(如 regex101)调试。
正则里中文匹配不到中文不是 \w,用 [\u4e00-\u9fa5] 或直接写中文。
.* 吃掉了太多该用惰性 .*? 的地方没加 ?。
✍️ 小练习
写程序:从一段文本中提取所有手机号(11位数字)、所有 email;并把文本中的年份 2026 替换为 2027。
📌 本节小结
正则核心:元字符定规则(\d 数字、\w 单词、*+? 数量、^$ 边界、[] 字符类、() 分组);re 四大方法 findall/search/match/sub 各司其职。写复杂正则前先在测试工具里验证。