在数据分析、爬虫、日志解析、表单校验等开发场景中,正则表达式是处理文本的利器。相比于基础字符串方法,正则能精准实现模糊匹配、批量提取、复杂替换等操作。
Python 内置 re 模块,无需额外安装第三方库,开箱即用。本文在基础用法之上,结合身份证、URL、中文提取、日志清洗、贪婪与非贪婪匹配等高频实战案例,带你吃透正则进阶用法,轻松解决日常文本处理难题。
1. 模块导入与核心概念
使用正则第一步,导入内置 re 模块:
python
import re
正则本质是用一套符号规则描述字符串模式 ,支持匹配、查找、提取、替换、分割。 写正则强烈建议使用原始字符串 r"" ,避免反斜杠 \ 双重转义,这是 Python 正则的最佳实践。
2. re.match:精准校验完整字符串
re.match(pattern, string) 从字符串开头 匹配,适合做格式校验,比如身份证、手机号、账号密码格式验证。
实战:校验 18 位身份证号
身份证规则:前 17 位数字,最后一位可为数字或 X/x
python
id_card_pattern = r"^[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$"
print(re.match(id_card_pattern, "34012320000101123X")) # 匹配成功
print(re.match(id_card_pattern, "123456")) # 匹配失败
规则拆解:
^:字符串开头,$:字符串结尾,严格匹配完整文本[1-9]\d{5}:6 位地区码(19|20)\d{2}:出生年份 19/20 开头- 后续匹配月、日、顺序码 + 校验位
注意:
match只从开头匹配,想在全文找内容用search。
3. re.search:全文查找首个匹配项
re.search() 扫描整个字符串,找到第一个符合规则的内容就返回,适合从杂乱文本中提取单个信息。
实战:提取文本中的 URL 链接
python
text = "我的博客:https://blog.csdn.net,备用网址:http://www.example.com"
url = re.search(r"https?://\w+\.\w+", text)
if url:
print("提取到URL:", url.group())
输出:
python
提取到URL: https://blog.csdn.net
正则解析:
https?:?匹配 0 次或 1 次,兼容 http/https://:固定协议符号\w+\.\w+:匹配域名主体 + 后缀
4. re.findall:批量提取所有匹配内容
re.findall() 是最常用的提取方法 ,扫描全文,返回所有匹配结果的列表,适合批量提取数字、关键词、链接、中文等。
实战 1:提取所有中文
python
text = "Python正则2026实战,提取中文,123测试数据"
chinese_list = re.findall(r"[\u4e00-\u9fa5]+", text)
print(chinese_list)
输出:
['正则', '实战', '提取中文', '测试数据']
[\u4e00-\u9fa5] 是 Unicode 编码,匹配所有中文字符。
实战 2:提取所有数字
python
text = "订单1:599元,订单2:1299元,运费20元"
nums = re.findall(r"\d+", text)
print(nums) # ['599', '1299', '20']
5. re.sub:高级文本替换与脱敏
re.sub(pattern, repl, string, count=0) 实现批量替换,可用于数据脱敏、清洗无用字符、格式化文本。
实战 1:手机号脱敏
python
text = "用户1:13812345678,用户2:15987654321"
# 中间4位替换为****
result = re.sub(r"(1[3-9]\d)\d{4}(\d{4})", r"\1****\2", text)
print(result)
输出:
plaintext
用户1:138****5678,用户2:159****4321
核心:() 分组,\1、\2 反向引用分组内容,精准替换中间位。
实战 2:清除文本中的特殊符号
python
text = "你好!@#¥%Python正则&*实战~"
result = re.sub(r"[^\u4e00-\u9fa5a-zA-Z0-9]", "", text)
print(result) # 你好Python正则实战
[^...] 表示非指定字符,清除所有非中文、非英文、非数字的符号。
6. re.split:多规则分割字符串
Python 原生 split() 只能按单个分隔符拆分,re.split() 支持多个分隔符、不定数量分隔符,处理脏数据更高效。
实战:分割杂乱日志文本
python
log = "2026-05-23;INFO,用户登录 账号:test 状态:成功"
# 按分号、逗号、空格分割
parts = re.split(r"[;,\s]+", log)
print(parts)
输出:
python
['2026-05-23', 'INFO', '用户登录', '账号:test', '状态:成功']
7. 正则核心符号进阶详解
除基础符号,进阶必学符号,直接应对复杂场景:
表格
| 符号 | 含义 |
|---|---|
\u4e00-\u9fa5 |
匹配所有中文 |
? |
0 次或 1 次,非贪婪核心 |
{n,m} |
匹配 n~m 次(如\d{6,12}) |
() |
分组,用于提取局部内容、反向引用 |
[^...] |
匹配非括号内的字符 |
.*? |
非贪婪匹配(最短匹配) |
.* |
贪婪匹配(最长匹配) |
重点:贪婪 vs 非贪婪匹配
python
html = "<div>标题1</div><div>标题2</div>"
# 贪婪匹配:匹配到最后一个</div>
res1 = re.findall(r"<div>.*</div>", html)
# 非贪婪匹配:逐个匹配
res2 = re.findall(r"<div>.*?</div>", html)
print(res1, res2)
正则中加?就是非贪婪,提取多组内容必用!
8. 五大方法场景选型总结
表格
| 方法 | 适用场景 |
|---|---|
| re.match | 完整字符串格式校验(身份证、账号) |
| re.search | 全文找第一个匹配项 |
| re.findall | 批量提取所有匹配内容(最常用) |
| re.sub | 文本替换、脱敏、清洗 |
| re.split | 多分隔符分割脏文本 |
9. 完整实战:日志文本清洗
综合所有用法,解析一段真实日志,提取时间、级别、内容:
python
log_text = """
2026-05-23 10:20:30 INFO: 用户test登录成功
2026-05-23 10:21:10 ERROR: 接口请求超时
2026-05-23 10:22:00 WARN: 内存占用过高
"""
# 提取时间、日志级别、内容
pattern = r"(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2})\s(\w+):\s(.+)"
result = re.findall(pattern, log_text)
for item in result:
print(f"时间:{item[0]},级别:{item[1]},内容:{item[2]}")
小结
本文从 Python 正则进阶用法出发,覆盖格式校验、批量提取、脱敏替换、脏数据分割、贪婪匹配、日志解析等实战场景。 核心要点:
- 正则优先使用原始字符串
r""; - 批量提取用
findall,校验用match,替换用sub; - 多组内容提取必须用非贪婪匹配
.*?; - 分组
()可精准提取局部信息。
正则是文本处理的万能工具,掌握基础符号 + 5 个核心方法,就能搞定 80% 的日常文本需求。