Python中的re库详细用法与代码解析

news2025/5/10 0:12:39

目录

1. 前言

2. 正则表达式的基本概念

2.1 什么是正则表达式?

2.2 常用元字符

3. re库的适应场景

3.1 验证用户输入

3.2 从文本中提取信息

3.3 文本替换与格式化

3.4 分割复杂字符串

3.5 数据清洗与预处理

4. re库的核心功能详解

4.1 re.match():从字符串开头匹配

4.2 re.search():在字符串中搜索匹配

4.3 re.findall():查找所有匹配项

4.4 re.finditer():返回迭代器对象

5.5 re.sub():替换匹配项

4.6 re.split():分割字符串

4.7 编译正则表达式

4.8 使用组提取特定信息

4.9 非贪婪匹配

5. 常见正则表达式模板

5.1 验证邮箱

5.2 验证手机号

5.3 匹配URL

5.4 提取日期

5.5 匹配HTML标签

6. 性能优化技巧

6.1 编译正则表达式

6.2 使用非捕获组

6.3 选择合适的匹配模式

6.4 预处理正则表达式

7. 总结


1. 前言

在数据处理、文本分析和自动化开发等场景中,文本处理是Python开发者最常面对的任务之一。想象一下,当你需要从用户输入中验证邮箱格式、从日志文件中提取错误信息、或从网页HTML中抓取特定数据时,手动逐字符检查和提取效率低且容易出错。Python的re库提供了强大的正则表达式支持,它就像一把瑞士军刀,能够优雅地解决各种复杂文本处理任务。本文将深入浅出地介绍re库的基本概念、适应场景和实战技巧,帮助你掌握这门文本处理的艺术。

2. 正则表达式的基本概念

2.1 什么是正则表达式?

正则表达式(Regular Expression,简称Regex)是一种文本模式描述语言,用于定义具有特定格式的字符串规则。它如同数学中的方程式,但操作对象是文本模式而非数值。

例如:

  • a 匹配字符a

  • a+ 匹配一个或多个连续的a

  • a? 匹配零个或一个a

  • a|b 匹配a或b

  • ^start 匹配以start开头的字符串

  • end$ 匹配以end结尾的字符串

2.2 常用元字符

正则表达式的强大来自于元字符(具有特殊含义的字符),以下是常用元字符及其含义:

元字符含义示例
.匹配任意单个字符(除换行符)a.b 匹配 aXb
*匹配前面的子表达式0次或多次ab* 匹配 a, ab, abb
+匹配前面的子表达式1次或多次ab+ 匹配 ab, abb
?匹配前面的子表达式0次或1次ab?c 匹配 ac 或 abc
[]匹配指定范围内的任意字符[a-z] 匹配小写字母
^匹配字符串开头或排除指定字符^hello 匹配以hello开头的字符串
$匹配字符串结尾world$ 匹配以world结尾的字符串
\d匹配任意数字\d{3} 匹配三位数字
\w匹配字母、数字或下划线\w+ 匹配连续的单词字符
\s匹配任意空白字符\s+ 匹配一个或多个空格

3. re库的适应场景

3.1 验证用户输入

import re

def validate_email(email):
    pattern = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'
    return re.match(pattern, email) is not None

print(validate_email("test@example.com"))  # True
print(validate_email("invalid_email@"))    # False

3.2 从文本中提取信息

text = "Contact us at contact@example.com or support@site.org"

# 提取所有邮箱地址
emails = re.findall(r'[\w.-]+@[\w.-]+', text)
print(emails)  # ['contact@example.com', 'support@site.org']

3.3 文本替换与格式化

text = "The price is $100.50 and the discount is $20"

# 将价格转换为中文格式
formatted_text = re.sub(r'\$(\d+\.?\d*)', r'¥\1', text)
print(formatted_text)  # The price is ¥100.50 and the discount is ¥20

3.4 分割复杂字符串

text = "apple,orange;banana grape"

# 使用多种分隔符分割
fruits = re.split(r'[;,,\s]\s*', text)
print(fruits)  # ['apple', 'orange', 'banana', 'grape']

3.5 数据清洗与预处理

text = "  Hello   World  This is   Python  "

# 去除多余空格并分割单词
clean_words = re.sub(r'\s+', ' ', text).strip().split()
print(clean_words)  # ['Hello', 'World', 'This', 'is', 'Python']

4. re库的核心功能详解

4.1 re.match():从字符串开头匹配

pattern = r'^Hello'
text = "Hello World!"

match_obj = re.match(pattern, text)
if match_obj:
    print("Match found:", match_obj.group())  # Match found: Hello
else:
    print("No match")

4.2 re.search():在字符串中搜索匹配

pattern = r'World'
text = "Hello World!"

search_obj = re.search(pattern, text)
if search_obj:
    print("Search found:", search_obj.group())  # Search found: World
else:
    print("Not found")

4.3 re.findall():查找所有匹配项

text = "The rain in Spain stays mainly in the plain"
pattern = r'ain'

matches = re.findall(pattern, text)
print(matches)  # ['ain', 'ain', 'ain']

4.4 re.finditer():返回迭代器对象

text = "The rain in Spain stays mainly in the plain"
pattern = r'ain'

for match in re.finditer(pattern, text):
    print(f"Found '{match.group()}' at position {match.start()}")

5.5 re.sub():替换匹配项

text = "Hello World"
pattern = r'World'
replacement = "Python"

new_text = re.sub(pattern, replacement, text)
print(new_text)  # Hello Python

4.6 re.split():分割字符串

text = "apple, orange; banana grape"
pattern = r'[;,]\s*'

result = re.split(pattern, text)
print(result)  # ['apple', 'orange', 'banana grape']

4.7 编译正则表达式

pattern = re.compile(r'\d+')

text1 = "There are 123 apples"
text2 = "And 456 oranges"

print(pattern.findall(text1))  # ['123']
print(pattern.findall(text2))  # ['456']

4.8 使用组提取特定信息

text = "John Doe: john.doe@example.com"

pattern = r'(\w+) (\w+): (\S+)'

match = re.match(pattern, text)
if match:
    first_name, last_name, email = match.groups()
    print(f"First Name: {first_name}")  # First Name: John
    print(f"Last Name: {last_name}")    # Last Name: Doe
    print(f"Email: {email}")            # Email: john.doe@example.com
  • (\S+): 匹配冒号后面的非空白字符(如 john.doe@example.com),捕获为 email

4.9 非贪婪匹配

text = "<div><p>Hello</p><span>World</span></div>"

# 贪婪匹配
print(re.findall(r'<div>.*</div>', text))  # ['<div><p>Hello</p><span>World</span></div>']

# 非贪婪匹配
print(re.findall(r'<div>.*?</div>', text))  # ['<div><p>Hello</p><span>World</span>']

5. 常见正则表达式模板

5.1 验证邮箱

email_pattern = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'

5.2 验证手机号

phone_pattern = r'^1[3-9]\d{9}$'  # 中国手机号
  1. \d{9}:匹配 9 个任意数字。\d 表示任意一个数字(0-9),{9} 表示前面的表达式(这里是指 \d)必须连续出现 9 次。

5.3 匹配URL

url_pattern = r'https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+'  # 简化版URL匹配

5.4 提取日期

date_pattern = r'\b(19|20)\d\d[-/.](0[1-9]|1[0-2])[-/.](0[1-9]|[12][0-9]|3[01])\b'

5.5 匹配HTML标签

html_tag_pattern = r'<(\w+)(?:\s+[^>]*)?>.*?</\1>'  # 匹配成对标签

6. 性能优化技巧

6.1 编译正则表达式

# 不编译
for text in large_text_list:
    re.findall(pattern, text)

# 编译后(推荐)
compiled_pattern = re.compile(pattern)
for text in large_text_list:
    compiled_pattern.findall(text)

6.2 使用非捕获组

# 普通组
pattern = r'(\d+)-(\d+)'

# 非捕获组(提高性能)
pattern = r'\d+-(?:\d+)'

6.3 选择合适的匹配模式

# 贪婪匹配可能导致性能问题
pattern = r'.*'

# 使用更精确的模式
pattern = r'\w+'

6.4 预处理正则表达式

# 预处理
patterns = {
    'email': re.compile(r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'),
    'phone': re.compile(r'^1[3-9]\d{9}$')
}

# 使用时直接调用
if patterns['email'].match(user_input):
    # 处理邮箱
    pass

7. 总结

Python的re库为我们提供了强大的文本处理能力,通过正则表达式,我们可以轻松应对各种复杂的文本匹配、提取、替换和验证任务。从简单的字符串检查到复杂的模式匹配,re库都能提供高效的解决方案。在实际开发中,合理使用正则表达式可以大大简化代码逻辑,提高程序的鲁棒性和可维护性。

然而,正则表达式的强大也意味着复杂性,设计不当的正则表达式可能导致性能问题甚至安全漏洞(如ReDoS攻击)。因此,在使用re库时,我们应遵循以下原则:

  1. 务必保持正则表达式的可读性,必要时添加注释

  2. 对于复杂的正则表达式,考虑使用reVERBOSE模式添加注释

  3. 测试各种可能的输入情况,确保正则表达式的行为符合预期

  4. 在处理大量数据时,注意性能优化,编译正则表达式并合理使用非捕获组

掌握re库不仅是一项技术技能,更是一种思维模式。它教会我们如何用模式化的思维分析问题、如何用最简洁的方式表达复杂的规则、以及如何在精确性和性能之间找到平衡。希望本文能帮助你深入理解Python的re库,让你在文本处理的战场上如虎添翼。我是橙色小博,关注我,一起在人工智能领域学习进步!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2371891.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

K8s网络从0到1

K8s网络从0到1 前言 K8s是一个强大的平台&#xff0c;但它的网络比较复杂&#xff0c;涉及很多概念&#xff0c;例如Pod网络&#xff0c;Service网络&#xff0c;Cluster IPs&#xff0c;NodePort&#xff0c;LoadBalancer和Ingress等等。为了帮助大家理解&#xff0c;模仿TC…

13.Excel:分列

一 分列的作用 将一个单元格中的内容拆分到两个或多个单元格当中。 二 如何使用 1.常规分列使用 注意&#xff1a;分列功能一次只能拆分一列。 长度一致或者数据间有分隔符。 补充&#xff1a;快速选择一列。 CTRL shift 向下箭头。 补充&#xff1a;中英文逗号不同。 可以先通…

计算机网络应用层(5)-- P2P文件分发视频流和内容分发网

&#x1f493;个人主页&#xff1a;mooridy &#x1f493;专栏地址&#xff1a;《计算机网络&#xff1a;自顶向下方法》 大纲式阅读笔记_mooridy的博客-CSDN博客 &#x1f493;本博客内容为《计算机网络&#xff1a;自顶向下方法》第二章应用层第五、六节知识梳理 关注我&…

Gin优雅关闭 graceful-shutdown

文章目录 优雅关闭示例 - Close 方法项目结构使用方法代码如下代码说明如果去掉代码中的数字1&#xff0c;会发生什么 优雅关闭示例项目结构使用方法使用上下文通知不使用上下文通知 代码 notify-without-context-server.go代码说明 代码 notify-with-context-server.go代码说明…

五子棋html

<!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"UTF-8" /> <meta name"viewport" content"widthdevice-width, initial-scale1" /> <title>五子棋游戏</title> <style>bo…

JavaWeb:后端web基础(TomcatServletHTTP)

一、今日内容 二、Tomcat 介绍与使用 介绍 基本使用 小结 配置 配置 查找进程 三、Servlet 什么是Servlet 快速入门 需求 步骤 1.新建工程-模块&#xff08;Maven&#xff09; 2.修改打包方式-war 3.编写代码 /*** 可以选择继承HttpServlet*/ WebServlet("/hello&q…

缓存(1):三级缓存

三级缓存是指什么 我们常说的三级缓存如下&#xff1a; CPU三级缓存Spring三级缓存应用架构&#xff08;JVM、分布式缓存、db&#xff09;三级缓存 CPU 基本概念 CPU 的访问速度每 18 个月就会翻 倍&#xff0c;相当于每年增⻓ 60% 左右&#xff0c;内存的速度当然也会不断…

Cursor —— AI编辑器 使用详解

Cursor - The AI Code Editor 一、Cursor 是什么&#xff1f; Cursor 是一款优秀的AI代码编辑器&#xff0c;它内置了 Deepseek-R1、GPT-4、Claude等 AI 模型。 简单说&#xff0c;就是&#xff1a;Cursor VS Code 编辑器 AI 大模型 Cursor 功能特性&#xff08;代码补全、…

Pytorch-CUDA版本环境配置

Pytorch-CUDA版本环境配置 电脑如果是Windows平台下的Nvidia GPU的用户&#xff0c;需配置Pytorch的CUDA版本&#xff0c;分为三步&#xff1a; 1. 安装或更新NVIDA显卡驱动 官方驱动下载地址&#xff1a; https://www.nvidia.cn/Download/index.aspx?langcn 2. 安装CUDA Too…

OpenCV 图形API(77)图像与通道拼接函数-----对图像进行几何变换函数remap()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 对图像应用一个通用的几何变换。 函数 remap 使用指定的映射对源图像进行变换&#xff1a; dst ( x , y ) src ( m a p x ( x , y ) , m a p y…

Spring AI 入门(持续更新)

介绍 Spring AI 是 Spring 项目中一个面向 AI 应用的模块&#xff0c;旨在通过集成开源框架、提供标准化的工具和便捷的开发体验&#xff0c;加速 AI 应用程序的构建和部署。 依赖 <!-- 基于 WebFlux 的响应式 SSE 传输 --> <dependency><groupId>org.spr…

QUIC协议优化:HTTP_3环境下的超高速异步抓取方案

摘要 随着 QUIC 和 HTTP/3 的普及&#xff0c;基于 UDP 的连接复用与内置加密带来了远超 HTTP/2 的性能提升&#xff0c;可显著降低连接握手与拥塞恢复的开销。本文以爬取知乎热榜数据为目标&#xff0c;提出一种基于 HTTPX aioquic 的异步抓取方案&#xff0c;并结合代理 IP设…

uni-app实现完成任务解锁拼图功能

界面如下 代码如下 <template><view class"puzzle-container"><view class"puzzle-title">任务进度 {{completedCount}}/{{totalPieces}}</view><view class"puzzle-grid"><viewv-for"(piece, index) in…

数据链路层(MAC 地址)

目录 一、前言&#xff1a; 二、以太网&#xff1a; 三、MAC 地址的作用&#xff1a; 四、ARP协议&#xff1a; 一、前言&#xff1a; 数据链路层主要负责相邻两个节点之间的数据传输&#xff0c;其中&#xff0c;最常见数据链路层的协议有 以太网&#xff08;通过光纤 / 网…

基于DQN的自动驾驶小车绕圈任务

1.任务介绍 任务来源: DQN: Deep Q Learning &#xff5c;自动驾驶入门&#xff08;&#xff1f;&#xff09; &#xff5c;算法与实现 任务原始代码: self-driving car 最终效果&#xff1a; 以下所有内容&#xff0c;都是对上面DQN代码的改进&#…

【Linux】Linux工具(1)

3.Linux工具&#xff08;1&#xff09; 文章目录 3.Linux工具&#xff08;1&#xff09;Linux 软件包管理器 yum什么是软件包关于 rzsz查看软件包——yum list命令如何安装软件如何卸载软件补充——yum如何找到要安装软件的下载地址 Linux开发工具Linux编辑器-vim使用1.vim的基…

基于 Spring Boot 瑞吉外卖系统开发(十一)

基于 Spring Boot 瑞吉外卖系统开发&#xff08;十一&#xff09; 菜品启售和停售 “批量启售”、“批量停售”、操作列的售卖状态绑定单击事件&#xff0c;触发单击事件时&#xff0c;最终携带需要修改售卖状态的菜品id以post请求方式向“/dish/status/{params.status}”发送…

深入理解负载均衡:传输层与应用层的原理与实战

目录 前言1. 传输层&#xff08;Layer 4&#xff09;负载均衡1.1 工作层级与核心机制1.2 实现方式详解1.3 优缺点分析1.4 典型实现工具 2. 应用层&#xff08;Layer 7&#xff09;负载均衡2.1 工作层级与核心机制2.2 实现方式解析2.3 优缺点分析2.4 常用实现工具 3. Layer 4 与…

WPF之Slider控件详解

文章目录 1. 概述2. 基本属性2.1 值范围属性2.2 滑动步长属性2.3 刻度显示属性2.4 方向属性2.5 选择范围属性 3. 事件处理3.1 值变化事件3.2 滑块拖动事件 4. 样式和模板自定义4.1 基本样式设置4.2 控件模板自定义 5. 数据绑定5.1 绑定到ViewModel5.2 同步多个控件 6. 实际应用…

企业微信自建消息推送应用

企业微信自建应用来推送消息 前言 最近有个给特定部门推送消息的需求&#xff0c;所以配置一个应用专门用来推送消息。实现过程大致为&#xff1a;服务器生成每天的报告&#xff0c;通过调用API来发送消息。以前一直都是发邮件&#xff0c;整个邮箱里全是报告文件&#xff0c…