当前位置: 首页 > article >正文

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

目录

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 redef validate_email(email):pattern = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'return re.match(pattern, email) is not Noneprint(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: Johnprint(f"Last Name: {last_name}")    # Last Name: Doeprint(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库,让你在文本处理的战场上如虎添翼。我是橙色小博,关注我,一起在人工智能领域学习进步!

相关文章:

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

目录 1. 前言 2. 正则表达式的基本概念 2.1 什么是正则表达式&#xff1f; 2.2 常用元字符 3. re库的适应场景 3.1 验证用户输入 3.2 从文本中提取信息 3.3 文本替换与格式化 3.4 分割复杂字符串 3.5 数据清洗与预处理 4. re库的核心功能详解 4.1 re.match()&#…...

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;中英文逗号不同。 可以先通…...

第十六届蓝桥杯大赛软件赛C/C++大学B组部分题解

第十六届蓝桥杯大赛软件赛C/C大学B组题解 试题A: 移动距离 问题描述 小明初始在二维平面的原点&#xff0c;他想前往坐标(233,666)。在移动过程中&#xff0c;他只能采用以下两种移动方式&#xff0c;并且这两种移动方式可以交替、不限次数地使用&#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代码说明…...

Android 查看 Logcat (可纯手机方式 无需电脑)

安装 Logcat Reader Github Google Play 如果有电脑 使用其ADB方式可执行如下命令 后续无需安装Termux # 使用 ADB 授予 android.permission.READ_LOGS 权限给 Logcat Reader adb shell "pm grant com.dp.logcatapp android.permission.READ_LOGS && am force-…...

Java 中常见的数据结构及其常用 API

本文总结了 Java 中常见的数据结构及其常用 API&#xff0c;帮助开发者在写算法时能够快速选择合适的数据结构和操作。通过使用合适的 API&#xff0c;可以有效减少计算复杂度&#xff0c;并提高代码的执行效率。 1. 数组 数组是 Java 中最常用的数据结构之一&#xff0c;Jav…...

五子棋html

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

在Laravel 12中实现基于parent_id的树状数组

在Laravel中实现基于parent_id的树状数组&#xff0c;可以通过预加载所有节点并在内存中递归构建树结构来完成。以下是具体步骤和代码示例&#xff1a; 1. 创建模型及数据库迁移 迁移文件&#xff1a; // 创建节点表 Schema::create(nodes, function (Blueprint $table) {$t…...

JavaWeb:后端web基础(TomcatServletHTTP)

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

C++负载均衡远程调用学习之负载均衡算法与实现

目录 01 lars 系统架构回顾 02 lars-lbAgentV0.4-route_lb处理report业务流程 03 lars-lbAgentV0.4-负责均衡判断参数配置 04 lars-lbAgentV0.4-负载均衡idle节点的失败率判断 05 lars-lbAgentV0.4-负载均衡overload节点的成功率判断 06 lars-lbAgentV0.4-负载均衡上报提交…...

缓存(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…...

一个完整的神经网络训练流程详解(附 PyTorch 示例)

&#x1f9e0; 一个完整的神经网络训练流程详解&#xff08;附 PyTorch 示例&#xff09; &#x1f4cc; 第一部分&#xff1a;神经网络训练流程概览&#xff08;总&#xff09; 在深度学习中&#xff0c;构建和训练一个神经网络模型并不是简单的“输入数据、得到结果”这么简…...

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…...

windows通过wsl安装ubuntu20.04

1 *.bat文件安装hyper-v pushd "%~dp0" dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt for /f %%i in (findstr /i . hyper-v.txt 2^>nul) do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"…...

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…...

Vue3 中当组件嵌套层级较深导致 ref 无法直接获取子组件实例时,可以通过 provide/inject + 回调函数的方式实现子组件方法传递到父组件

需求&#xff1a;vue3中使用defineExposeref调用子组件方法报错不是一个function 思路&#xff1a;由于组件嵌套层级太深导致ref失效&#xff0c;通过provide/inject 回调函数来实现多层穿透 1. 父组件提供「方法注册函数」 父组件通过 provide 提供一个用于接收子组件方法…...

关于 js:3. 闭包、作用域、内存模型

一、闭包的本质&#xff1a;函数 其词法作用域环境 闭包&#xff08;Closure&#xff09;的本质可以概括为&#xff1a; 闭包是一个函数&#xff0c;以及它定义时捕获的词法作用域中的变量集合。 这意味着&#xff1a;即使外部函数已经返回或作用域结束&#xff0c;只要有内…...

数据链路层(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代码的改进&#…...

terraform resource创建了5台阿里云ecs,如要使用terraform删除其中一台主机,如何删除?

在 Terraform 中删除阿里云 5 台 ECS 实例中的某一台&#xff0c;具体操作取决于你创建资源时使用的 多实例管理方式&#xff08;count 或 for_each&#xff09;。以下是详细解决方案&#xff1a; 方法一&#xff1a;使用 for_each&#xff08;推荐&#xff09; 如果创建时使…...

【Linux】Linux工具(1)

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

探索大语言模型(LLM):词袋法(Bag of Words)原理与实现

文章目录 引言一、词袋法原理1.1 核心思想1.2 实现步骤 二、数学公式2.1 词频表示2.2 TF-IDF加权&#xff08;可选&#xff09; 三、示例表格3.1 构建词汇表3.2 文本向量化&#xff08;词频&#xff09; 四、Python代码实现4.1 基础实现&#xff08;手动计算&#xff09;4.2 输…...

vue引入物理引擎matter.js

vue引入物理引擎matter.js 在 Vue 项目中集成 Matter.js 物理引擎的步骤如下: 1. 安装 Matter.js npm install matter-js # 或 yarn add matter-js2. 创建 Vue 组件 <template><div ref="physicsContainer" class="physics-container"><…...

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

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