Python 正则表达式进阶实战:从文本清洗到复杂信息提取

在数据分析、爬虫、日志解析、表单校验等开发场景中,正则表达式是处理文本的利器。相比于基础字符串方法,正则能精准实现模糊匹配、批量提取、复杂替换等操作。

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 正则进阶用法出发,覆盖格式校验、批量提取、脱敏替换、脏数据分割、贪婪匹配、日志解析等实战场景。 核心要点:

  1. 正则优先使用原始字符串 r""
  2. 批量提取用 findall,校验用 match,替换用 sub
  3. 多组内容提取必须用非贪婪匹配 .*?
  4. 分组 () 可精准提取局部信息。

正则是文本处理的万能工具,掌握基础符号 + 5 个核心方法,就能搞定 80% 的日常文本需求。

相关推荐
我命由我123456 小时前
Android Framework P3 - MediaServer 进程、认识 ServiceManager 进程
android·c语言·开发语言·c++·visualstudio·visual studio·android runtime
计算机安禾6 小时前
【c++面向对象编程】第48篇:Lambda表达式与std::function:OOP中的函数式编程
java·c++·算法
小陶来咯6 小时前
大模型Function Calling的底层原理
python·ai
yuhuofei20216 小时前
【Python入门】Python中的输入与输出
开发语言·python
川冰ICE6 小时前
Python爬虫实战㉘|综合实战3,新闻热点追踪与舆情分析系统
开发语言·爬虫·python
chxin140166 小时前
CMake 笔记
c++
Xidaoapi6 小时前
一次Python内存泄漏的真实排查经历
python
xing-xing6 小时前
PIP工具学习总结
python·pip
晚烛6 小时前
CANN 数据流水线优化:从数据加载到模型输入的端到端加速
开发语言·网络·人工智能·python·深度学习