Python3 正则表达式(Regular Expressions)
Python3 正则表达式(Regular Expressions)
🎯 学习目标
掌握 Python 中正则表达式模块 re 的使用方法,能够在字符串匹配、提取、替换等常见场景中灵活应用。结合实际项目案例理解正则的语法结构与应用场景,并能利用 PyCharm 高效调试正则表达式。
🔑 核心重点
| 分类 | 内容 |
|---|---|
| 模块名 | re |
| 主要功能 | 字符串匹配、查找、替换、分组、贪婪/非贪婪模式等 |
| 应用场景 | 数据清洗、日志分析、表单验证、爬虫数据提取 |
| 推荐工具 | 使用在线测试工具(如 regex101.com)辅助编写 |
| 实战建议 | 结合 re.compile() 提高性能,避免重复编译正则表达式 |
📚 详细讲解
一、什么是正则表达式?
正则表达式(Regular Expression) 是一种用于描述字符串模式的强大工具,可以用来:
- 判断一个字符串是否符合某种格式(如邮箱、电话号码)
- 提取字符串中的特定部分(如 URL 中的参数)
- 替换或删除某些内容(如敏感词过滤)
在 Python 中,我们通过内置模块 re 来实现正则表达式的操作。
二、常用函数(方法)
| 方法 | 功能说明 | 示例 |
|---|---|---|
re.match() |
从字符串开头开始匹配,只返回第一个 | re.match(r'\d+', '123abc') |
re.search() |
扫描整个字符串,返回第一个匹配项 | re.search(r'cat', 'The cat is cute') |
re.findall() |
返回所有匹配项列表 | re.findall(r'\d+', 'a12b34c56') |
re.finditer() |
返回迭代器,每个元素是匹配对象 | 可遍历获取多个匹配结果 |
re.sub() |
替换匹配的内容 | re.sub(r'old', 'new', text) |
re.split() |
按匹配内容分割字符串 | re.split(r'\d+', 'a1b2c3') |
re.compile() |
编译正则表达式,提升多次使用的效率 | pattern = re.compile(r'\d+') |
三、基础语法符号
| 符号 | 含义 | 示例 |
|---|---|---|
\d |
数字 [0-9] | r'\d{3}' 匹配三位数字 |
\D |
非数字 | r'\D+' 匹配连续非数字字符 |
\w |
单词字符 [a-zA-Z0-9_] | r'\w+' 匹配单词 |
\W |
非单词字符 | |
\s |
空白字符(空格、换行等) | r'\s+' 匹配任意空白 |
\S |
非空白字符 | |
. |
任意字符(除换行) | r'.*' 匹配任意字符 |
^ |
开始位置 | r'^abc' 匹配以 abc 开头 |
| ` | 符号 | 含义 |
| -------- | ------------------------ | ------------------------------ |
\d |
数字 [0-9] | r'\d{3}' 匹配三位数字 |
\D |
非数字 | r'\D+' 匹配连续非数字字符 |
\w |
单词字符 [a-zA-Z0-9_] | r'\w+' 匹配单词 |
\W |
非单词字符 | |
\s |
空白字符(空格、换行等) | r'\s+' 匹配任意空白 |
\S |
非空白字符 | |
. |
任意字符(除换行) | r'.*' 匹配任意字符 |
^ |
开始位置 | r'^abc' 匹配以 abc 开头 |
\| 结束位置 \| `r'end$'` 匹配以 end 结尾 |
| * | 0 次或多次 | r'a*' 匹配 a 出现 0 或多次 |
| + | 至少一次 | r'a+' 匹配至少一个 a |
| ? | 0 次或 1 次 | r'a?' 匹配 a 出现 0 或 1 次 |
| {n} | 精确 n 次 | r'a{3}' 匹配 aaa |
| {n, m} | n 到 m 次 | r'\d{1,3}' 匹配 1~3 位数字 |
| [] | 字符集合 | r'[aeiou]' 匹配元音字母 |
| () | 分组捕获 | r'(\d{3})-(\d{4})' |
| | | 或 | r'red|blue' 匹配 red 或 blue |
四、实战示例
✅ 示例 1:匹配手机号码(中国大陆)
import re
text = "我的电话是 13812345678,请联系我。"
pattern = r'1[3-9]\d{9}'
match = re.search(pattern, text)
if match:
print("找到手机号:", match.group())
📌 输出:
找到手机号: 13812345678
✅ 示例 2:提取网页链接
import re
html = '''
<a href="https://example.com">主页</a>
<a href="http://test.org">测试网站</a>
'''
urls = re.findall(r'https?://[^\s"]+', html)
print(urls)
📌 输出:
['https://example.com', 'http://test.org']
✅ 示例 3:替换敏感词为 ****
import re
text = "这个电影真垃圾,太烂了!"
bad_words = ["垃圾", "烂"]
# 构建正则模式:(垃圾|烂)
pattern = re.compile(r'|'.join(map(re.escape, bad_words)))
cleaned = pattern.sub('****', text)
print(cleaned)
📌 输出:
这个电影真****,太****了!
✅ 示例 4:使用分组提取日期信息
import re
log_line = "ERROR: 2025-04-05 14:30:00 - Something went wrong"
pattern = r'(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2})'
match = re.search(pattern, log_line)
if match:
date_str, time_str = match.groups()
print(f"日期: {date_str}, 时间: {time_str}")
📌 输出:
日期: 2025-04-05, 时间: 14:30:00
⚠️ 注意事项
re.match()仅从字符串开头开始匹配,若需全文搜索请使用re.search()- 特殊字符如
.、?、*等在正则中有特殊含义,需转义时加\(如\.com) - 使用
re.compile()提升多次匹配的性能 - 分组
( )和非捕获(?: )要区分清楚,避免不必要的捕获 - 正则表达式默认是“贪婪”匹配,可使用
?改为“非贪婪” - 在 PyCharm 中调试正则时,可使用“Find in Path”功能测试正则表达式
🧪 实际案例分析
📌 场景:日志文件分析工具
功能需求:
- 读取日志文件,提取每行的时间戳、日志等级、消息
- 统计各等级日志数量(INFO/WARNING/ERROR)
示例代码:
import re
from collections import defaultdict
def analyze_log(file_path):
pattern = re.compile(r'(?P<timestamp>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) - (?P<level>\w+) - (?P<message>.*)')
counts = defaultdict(int)
with open(file_path, 'r', encoding='utf-8') as f:
for line in f:
match = pattern.match(line.strip())
if match:
level = match.group('level')
counts[level] += 1
for level, count in counts.items():
print(f"{level}: {count}")
# 假设有一个 logs.txt 文件,格式如下:
# 2025-04-05 14:30:00 - INFO - User logged in
# 2025-04-05 14:31:00 - ERROR - Database connection failed
📌 说明:
- 使用命名分组捕获时间戳、等级、消息
- 使用
defaultdict统计出现次数 - 可扩展为自动报警系统,当 ERROR 达到一定数量时触发通知
🧩 拓展练习(动手实践)
- 编写程序提取一段文本中的所有电子邮件地址。
- 编写一个函数判断输入的字符串是否是一个合法的 IP 地址(IPv4)。
- 编写脚本将一段中文文本中的标点符号全部去除。
- 编写程序提取 HTML 文本中的所有
<img>标签,并提取src属性值。 - 编写一个身份证号码解析器,提取出生年月日、性别、地区编码等信息。
🧭 下一步建议
- 下一章学习内容:《Python3 异常处理机制》
- 掌握异常捕获、自定义异常类、finally 与 else 的使用
- 学会在文件操作、网络请求等场景中合理使用异常处理
- 理解断言(assert)和上下文管理器(with)的作用
如果你希望我为你提供:
- Python 正则表达式速查表 PDF(含符号解释 + 示例)
- 更多实战项目练习题(如爬虫提取、日志分析、配置文件解析等)
- 视频教学资源推荐(中文讲解)
- 如何结合 PyCharm 快捷键快速测试正则表达式
欢迎随时告诉我 😊

浙公网安备 33010602011771号