🎯 第一部分:正则表达式(re 模块)
✅ 1. re 模块核心方法
| 方法 | 功能 | 类比 |
| :— | :— | :— |
| re.match() | 从开头匹配 | 检查手机号是否以 1 开头 |
| re.search() | 查找第一个匹配项 | 在文章中找第一个邮箱 |
| re.findall() | 查找所有匹配项 | 提取文中所有 URL |
| re.split() | 根据模式分割字符串 | 用逗号把句子拆成词 |
| re.sub() | 替换匹配项 | 把电话号码中的横线换成空格 |

符号意思
\S非空格的字符(字母、数字、符号都算)
\s空格、换行、制表符等空白字符
\d数字 0-9
+前面的东西至少出现 1 次,越多越好
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import re

text = "我的邮箱是 zhangsan@163.com,另一个是 lisi@qq.com"

# 1. 找第一个邮箱
email = re.search(r'\S+@\S+', text) # 一串非空格 + @ + 一串非空格
if email:
print("找到邮箱:", email.group()) # 输出: zhangsan@163.com

# 2. 找所有邮箱
emails = re.findall(r'\S+@\S+', text) #
print("所有邮箱:", emails) # 输出: ['zhangsan@163.com', 'lisi@qq.com']

# 3. 分割字符串
words = re.split(r'[,。;!?]', text) # 遇到 , 。 ; ! ? 这些符号,就切一刀!
print("分词结果:", words)

# 4. 替换数字为 *
text2 = "电话:138-1234-5678"
new_text = re.sub(r'\d', '*', text2) # 把所有数字(\d)都替换成星号(*)
print("替换后:", new_text) # 输出: 电话:***-****-****

✅ 2. 正则模式语法(元字符)
| 元字符 | 含义 | 示例 |
| :— | :— | :— |
| . | 匹配任意字符(除了换行) | a.c → 匹配 abc, a1c |
| ^ | 行开头 | ^hello → 只匹配以 hello 开头的行 |
| $ | 行结尾 | world$ → 只匹配以 world 结尾的行 |
| * | 前一个字符重复 0 次或多次 | a* → 匹配 "", "a", "aa" |
| + | 前一个字符重复 1 次或多次 | a+ → 匹配 "a", "aa",不匹配 "" |
| ? | 前一个字符重复 0 或 1 次 | a? → 匹配 "", "a" |
| {m} | 重复 m 次 | a{3} → 匹配 "aaa" |
| {m,n} | 重复 m 到 n 次 | a{2,4} → 匹配 "aa", "aaa", "aaaa" |
| [] | 字符集合 | [abc] → 匹配 a、b、c 中任意一个 |
| \ | 转义字符 | \. → 匹配点号(不是任意字符) |

应该掌握什么?(核心能力)
| 层级 | 应掌握的内容 | 为什么重要 |
|——|—————-|———–|
| 1. 概念理解 | 知道“正则表达式是用来匹配/提取/替换文本模式的工具”
知道 re.search() 是找第一个匹配,re.findall() 是找所有 | 决定你能不能想到用它解决问题 |
| 2. 函数作用 | 记住 re.match / search / findall / sub / split 各自是做什么的
知道 os.path.exists() 判断文件是否存在 | 决定你会不会选对工具 |
| 3. 常见模式 | 会写最基础的:
- \d+(数字)
- [a-z]+(小写字母)
- \S+@\S+(简单邮箱)
- https?://\S+(URL) | 覆盖 80% 日常需求 |
| 4. 调试意识 | 知道如何测试正则是否匹配(比如用在线工具 regex101.com)
知道 group() 可以取结果 | 避免“写了但不知道对不对” |

graph LR
A[遇到文本处理问题] –> B{我能用正则解决吗?}
B – 能 –> C[回忆核心方法:search/findall/sub]
C –> D[写出大致模式:比如 \d+ 或 @\S+]
D –> E[让 AI 帮我完善细节或调试]
E –> F[运行验证 → 成功!]
B – 不能 –> G[考虑其他方案:字符串方法 / 解析库]