第 38 课 · 阶段七 · 进阶主题
正则表达式
正则表达式是文本处理的“万能钥匙”:匹配、查找、替换、提取。这一课掌握 re 模块的核心 API 与常用元字符。
🎯 学完本课你将掌握
- 理解正则表达式的作用
- 掌握常用元字符与字符类
- 熟练使用 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 re23text = "我的电话是 138-1234-5678,备用 139-0000-1111"45# 1. re.findall:找出所有匹配6phones = re.findall(r"\d{3}-\d{4}-\d{4}", text)7print(phones) # ['138-1234-5678', '139-0000-1111']89# 2. re.search:找第一个匹配(返回对象)10m = re.search(r"\d{3}-\d{4}-\d{4}", text)11print(m.group()) # 138-1234-56781213# 3. re.match:从开头匹配14print(re.match(r"\d", "abc123")) # None(开头不是数字)15print(re.match(r"\d", "123abc").group()) # 11617# 4. re.sub:替换18new = re.sub(r"\d{4}-\d{4}", "****-****", text)19print(new)✅ 要点
写正则时在字符串前加 r(原始字符串),避免 \\ 转义地狱。
四、字符类与分组
字符类分组.py
1import re2# 字符类 [ ]:匹配其中任意一个3print(re.findall(r"[abc]", "a1b2c3")) # ['a','b','c']4print(re.findall(r"[0-9]", "a1b2c3")) # ['1','2','3']56# 分组 ( ):提取部分内容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 re23def check_email(email):4 pattern = r"^[\w.-]+@[\w-]+\.[\w.]+$"5 return bool(re.match(pattern, email))67print(check_email("user@example.com")) # True8print(check_email("bad@@mail")) # False9print(check_email("user name@x.com")) # False(有空格)六、惰性匹配与贪婪匹配
默认 * 和 + 是贪婪的(尽可能多匹配);加 ? 变惰性(尽可能少匹配)。
贪婪 vs 惰性.py
1import re2text = "<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 各司其职。写复杂正则前先在测试工具里验证。