Python使用正则表达式实现从文本清洗到复杂信息提取的实战指南

 更新时间:2026年05月29日 09:06:15   作者:我材不敲代码  
在数据分析、爬虫、日志解析、表单校验等开发场景中,正则表达式是处理文本的利器,本文深入解析Python正则表达式,覆盖格式校验、批量提取、脱敏替换等场景,通过身份证、URL、中文提取等实战案例,助你掌握正则进阶用法,需要的朋友可以参考下

引言

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

Python 内置 re 模块,无需额外安装第三方库,开箱即用。本文在基础用法之上,结合身份证、URL、中文提取、日志清洗、贪婪与非贪婪匹配等高频实战案例,带你吃透正则进阶用法,轻松解决日常文本处理难题。

1. 模块导入与核心概念

使用正则第一步,导入内置 re 模块:

import re

正则本质是用一套符号规则描述字符串模式,支持匹配、查找、提取、替换、分割。 写正则强烈建议使用原始字符串 r"",避免反斜杠 \ 双重转义,这是 Python 正则的最佳实践。

2. re.match:精准校验完整字符串

re.match(pattern, string)字符串开头匹配,适合做格式校验,比如身份证、手机号、账号密码格式验证。

实战:校验 18 位身份证号

身份证规则:前 17 位数字,最后一位可为数字或 X/x

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 链接

text = "我的博客:https://blog.csdn.net,备用网址:http://www.example.com"
url = re.search(r"https?://\w+\.\w+", text)
if url:
    print("提取到URL:", url.group())

输出:

提取到URL: https://blog.csdn.net

正则解析:

  • https?? 匹配 0 次或 1 次,兼容 http/https
  • ://:固定协议符号
  • \w+\.\w+:匹配域名主体 + 后缀

4. re.findall:批量提取所有匹配内容

re.findall()最常用的提取方法,扫描全文,返回所有匹配结果的列表,适合批量提取数字、关键词、链接、中文等。

实战 1:提取所有中文

text = "Python正则2026实战,提取中文,123测试数据"
chinese_list = re.findall(r"[\u4e00-\u9fa5]+", text)
print(chinese_list)

输出:

['正则', '实战', '提取中文', '测试数据']

[\u4e00-\u9fa5] 是 Unicode 编码,匹配所有中文字符。

实战 2:提取所有数字

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:手机号脱敏

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:清除文本中的特殊符号

text = "你好!@#¥%Python正则&*实战~"
result = re.sub(r"[^\u4e00-\u9fa5a-zA-Z0-9]", "", text)
print(result)  # 你好Python正则实战

[^...] 表示指定字符,清除所有非中文、非英文、非数字的符号。

6. re.split:多规则分割字符串

Python 原生 split() 只能按单个分隔符拆分,re.split() 支持多个分隔符、不定数量分隔符,处理脏数据更高效。

实战:分割杂乱日志文本

log = "2026-05-23;INFO,用户登录 账号:test 状态:成功"
# 按分号、逗号、空格分割
parts = re.split(r"[;,\s]+", log)
print(parts)

输出:

['2026-05-23', 'INFO', '用户登录', '账号:test', '状态:成功']

7. 正则核心符号进阶详解

除基础符号,进阶必学符号,直接应对复杂场景:

表格

符号含义
\u4e00-\u9fa5匹配所有中文
?0 次或 1 次,非贪婪核心
{n,m}匹配 n~m 次(如\d{6,12}
()分组,用于提取局部内容、反向引用
[^...]匹配非括号内的字符
.*?非贪婪匹配(最短匹配)
.*贪婪匹配(最长匹配)

重点:贪婪 vs 非贪婪匹配

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. 完整实战:日志文本清洗

综合所有用法,解析一段真实日志,提取时间、级别、内容:

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% 的日常文本需求。

以上就是Python使用正则表达式实现从文本清洗到复杂信息提取的实战指南的详细内容,更多关于Python正则表达式实战指南的资料请关注脚本之家其它相关文章!

相关文章

  • Python 数字转化成列表详情

    Python 数字转化成列表详情

    这篇文章主要介绍了Python 数字转化成列表,主要以代码实现了将输入的数字转化成一个列表,输入数字中的每一位按照从左到右的顺序成为列表中的一项。,需要的朋友可以参考下
    2021-11-11
  • python根据字典的键来删除元素的方法

    python根据字典的键来删除元素的方法

    在本篇文章里小编给大家整理的是一篇关于python根据字典的键来删除元素的方法,有兴趣的朋友们可以参考下。
    2020-08-08
  • python爬虫之遍历单个域名

    python爬虫之遍历单个域名

    在本篇文章里小编给大家整理的是一篇关于python遍历单个域名的知识点和操作方法,有需要的朋友们学习下。
    2019-11-11
  • pycharm实现增加运行时内存

    pycharm实现增加运行时内存

    这篇文章主要介绍了pycharm实现增加运行时内存方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • python中if-elif-else语句实例用法讲解

    python中if-elif-else语句实例用法讲解

    在本篇文章里小编给大家整理的是一篇关于python中if-elif-else语句的使用注意事项,有需要的便宜么可以跟着参考下。
    2021-10-10
  • Pandas数据类型之category的用法

    Pandas数据类型之category的用法

    Pandas中有一种特殊的数据类型叫做category.它表示的是一个类别,一般用在统计分类中,比如性别,血型,分类,级别等等.有点像java中的enum,今天给大家详细讲解一下category的用法,需要的朋友可以参考下
    2021-06-06
  • Python基于class()实现面向对象原理详解

    Python基于class()实现面向对象原理详解

    这篇文章主要介绍了Python基于class()实现面向对象原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 浅谈哪个Python库才最适合做数据可视化

    浅谈哪个Python库才最适合做数据可视化

    数据可视化是任何探索性数据分析或报告的关键步骤,目前有许多非常好的商业智能工具,比如Tableau、googledatastudio和PowerBI等,本文就详细的进行对比,感兴趣的可以了解一下
    2021-06-06
  • Python使用Matplotlib实现Logos设计代码

    Python使用Matplotlib实现Logos设计代码

    这篇文章主要介绍了Python使用Matplotlib实现Logos设计代码,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • 创建SparkSession和sparkSQL的详细过程

    创建SparkSession和sparkSQL的详细过程

    SparkSession 是 Spark SQL 的入口,Builder 是 SparkSession 的构造器。 通过 Builder, 可以添加各种配置,并通过 stop 函数来停止 SparkSession,本文给大家分享创建SparkSession和sparkSQL的详细过程,一起看看吧
    2021-08-08

最新评论