Python正则表达式re模块核心功能详解
在Python中,处理正则表达式的标准库是re。你可以把它想象成一把文本处理的“瑞士军刀”,专门用来在海量文本中查找、提取、替换或验证特定格式的字符串。
一、核心工具箱:5个最常用的方法
在使用前,记得先导入模块:import re
| 方法 | 作用 | 形象比喻 | 返回值 |
|---|---|---|---|
| re.match() | 从开头匹配 | “必须从门口进入” | 匹配成功返回对象,失败返回None |
| re.search() | 扫描全文找第一个 | “在屋里找一遍,找到就停” | 匹配成功返回对象,失败返回None |
| re.findall() | 找到所有匹配项 | “把所有符合条件的都抓出来” | 列表 ['a', 'b', ...] |
| re.sub() | 替换文本 | “把这里的A换成B” | 替换后的新字符串 |
| re.split() | 按规则分割 | “按这个符号切开” | 分割后的列表 |
二、代码实战:一看就懂
1. 查找与提取(search vs findall)
如果你想提取文本中的手机号或数字:
1 | import re |
2. 替换 (sub)
如果你想把敏感词或者特定字符换掉:
1 | text = "今天天气真好,今天心情不错" |
3. 验证 (match)
如果你想校验用户输入是否符合格式(比如必须以 "Hello" 开头):
1 | text = "Hello Python" |
三、语法速查表:正则的“单词”
正则表达式难就难在那些特殊符号。这里有一份Python中最常用的符号清单:
| 符号 | 含义 | 示例 | 匹配结果 |
|---|---|---|---|
| . | 匹配任意字符(除换行符) | a.c | "abc", "a c" |
| \d | 匹配数字 [0-9] | \d+ | "123" |
| \w | 匹配字母、数字、下划线 | \w+ | "user_1" |
| \s | 匹配空白字符(空格、Tab等) | a\sb | "a b" |
| ^ | 匹配字符串开头 | ^Hello | 必须以Hello开头 |
| $ | 匹配字符串结尾 | World$ | 必须以World结尾 |
| * | 匹配 0 次或多次 | ab* | "a", "ab", "abb" |
| + | 匹配 1 次或多次 | ab+ | "ab", "abb" (不含 "a") |
| ? | 匹配 0 次或 1 次 | ab? | "a", "ab" |
| {n,m} | 匹配 n 到 m 次 | \d{2,4} | "12", "123", "1234" |
四、两个至关重要的“潜规则”
1. 为什么要用r 前缀?
你可能会看到很多正则都写成 r"\d+" 而不是 "\d+":
- 原因:Python字符串本身会对
\转义(比如\n是换行)。为了避免Python 解释器和正则引擎“打架”,我们使用原始字符串(Raw String),即在引号前加r。 - 建议:写正则时,永远加上
r,比如re.search(r"...", text)。
2. 贪婪 vs 非贪婪
默认情况下,正则是“贪婪”的,它会尽可能多地匹配字符:
- 贪婪模式:
.*- 匹配文本:
<div>内容A</div><div>内容B</div> - 结果:它会一口气匹配整个字符串(因为它想匹配到最后一个
</div>)。
- 匹配文本:
- 非贪婪模式(加个 ?):
.*?- 结果:它会匹配到第一个
</div>就停下来,分别提取出两个 div 内容。
- 结果:它会匹配到第一个
五、进阶提示:预编译
如果你要在循环里大量使用同一个正则(比如处理 1 万行日志),建议先用 re.compile() 把它编译成对象,这样速度会更快:
1 | # 预编译 |
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.

