正则表达式的艺术:轻松驾驭 Python 的 re 库

目录

一、正则表达式的基本概念

二、Python 的 re 库简介

三、正则表达式的元字符

四、正则表达式的贪婪与非贪婪模式

五、实战案例

六、总结



正则表达式(Regular Expression)是文本处理中不可或缺的工具,它强大而灵活,能够帮助我们高效地匹配、查找、替换复杂的文本模式。Python 的 re 库为我们提供了便捷的正则表达式操作接口。本文将带你领略正则表达式的艺术,通过简洁明了的代码和案例,轻松驾驭 Python 的 re 库。

一、正则表达式的基本概念

正则表达式是由普通字符(如字母、数字)和特殊字符(如元字符)组成的字符串模式,用于描述在搜索文本时要匹配的一个或多个字符串。

  • 普通字符:如 a、b、1、2 等,它们匹配自身。
  • 特殊字符:如 .、*、?、+ 等,它们具有特殊的含义。

例如,正则表达式 abc 匹配字符串中的子串 "abc",而正则表达式 a.c 匹配 "abc"、"adc"、"a1c" 等。

二、Python 的 re 库简介

Python 的 re 库提供了对正则表达式的支持,主要功能包括匹配、搜索、替换等。

导入 re 库:

import re

主要函数:

  • re.match(pattern, string, flags=0):从字符串的起始位置匹配正则表达式,返回匹配对象,否则返回 None。
  • re.search(pattern, string, flags=0):扫描字符串,返回第一个匹配正则表达式的位置,否则返回 None。
  • re.findall(pattern, string, flags=0):查找字符串中所有与正则表达式匹配的非重叠匹配项,返回一个列表。
  • re.finditer(pattern, string, flags=0):查找字符串中所有与正则表达式匹配的非重叠匹配项,返回一个迭代器,每个迭代元素是一个匹配对象。
  • re.sub(pattern, repl, string, count=0, flags=0):使用 repl 替换字符串中与正则表达式匹配的子串,返回替换后的字符串。
  • re.split(pattern, string, maxsplit=0, flags=0):根据正则表达式的匹配项来分割字符串,返回一个列表。

三、正则表达式的元字符

正则表达式中的元字符具有特殊含义,它们用于构建复杂的匹配模式。

点号 .:匹配除换行符以外的任意字符。

pattern = r'a.c'
string = 'abc adc a1c'
matches = re.findall(pattern, string)
print(matches)  # 输出: ['abc', 'adc', 'a1c']

星号 *:匹配前面的字符零次或多次。
 

pattern = r'ab*c'
string = 'ac abc abbc abbbc'
matches = re.findall(pattern, string)
print(matches)  # 输出: ['ac', 'abc', 'abbc', 'abbbc']

加号 +:匹配前面的字符一次或多次。

pattern = r'ab+c'
string = 'ac abc abbc abbbc'
matches = re.findall(pattern, string)
print(matches)  # 输出: ['abc', 'abbc', 'abbbc']

问号 ?:匹配前面的字符零次或一次。
 

pattern = r'ab?c'
string = 'ac abc'
matches = re.findall(pattern, string)
print(matches)  # 输出: ['ac', 'abc']

花括号 {}:指定前面的字符出现的次数,如 {n} 表示恰好 n 次,{n,} 表示至少 n 次,{n,m} 表示 n 到 m 次。

pattern = r'ab{2,3}c'
string = 'abc abbc abbbc abbbbc'
matches = re.findall(pattern, string)
print(matches)  # 输出: ['abbc', 'abbbc']

方括号 []:字符集合,匹配方括号内的任意字符。例如 [abc] 匹配 'a'、'b' 或 'c'。

pattern = r'a[bc]d'
string = 'abd acd'
matches = re.findall(pattern, string)
print(matches)  # 输出: ['abd']

脱字符 ^:匹配字符串的起始位置。
 

pattern = r'^abc'
string = 'abc def'
match = re.match(pattern, string)
if match:print('Match found at the start of the string.')
else:print('No match found.')  # 输出: Match found at the start of the string.

美元符 $:匹配字符串的结束位置。
 

pattern = r'def$'
string = 'abc def'
match = re.search(pattern, string)
if match:print('Match found at the end of the string.')
else:print('No match found.')  # 输出: Match found at the end of the string.

管道符 |:表示逻辑或,匹配管道符左右两边的任意一边。
 

pattern = r'abc|def'
string = 'abc def ghi abc'
matches = re.findall(pattern, string)
print(matches)  # 输出: ['abc', 'def', 'abc']

反斜杠 \:转义字符,用于匹配特殊字符或表示特殊序列,如 \n 表示换行符,\t 表示制表符。
 

pattern = r'a\.c'
string = 'a.c a\tc'
matches = re.findall(pattern, string)
print(matches)  # 输出: ['a.c']

圆括号 ():分组,用于提取匹配的子串或进行复杂的匹配模式。

pattern = r'(abc)def'
string = 'abcdef ghiabcdef'
matches = re.findall(pattern, string)
print(matches)  # 输出: ['abc', 'abc']

四、正则表达式的贪婪与非贪婪模式

正则表达式默认采用贪婪模式,即尽可能多地匹配字符。例如,a.*b 会匹配最长的以 'a' 开头、以 'b' 结尾的子串。

pattern = r'a.*b'
string = 'a123b456b'
match = re.search(pattern, string)
if match:print(match.group())  # 输出: a123b456b

如果希望采用非贪婪模式,即尽可能少地匹配字符,可以在量词后面加上 ?。例如,a.*?b 会匹配最短的以 'a' 开头、以 'b' 结尾的子串。

pattern = r'a.*?b'
string = 'a123b456b'
match = re.search(pattern, string)
if match:print(match.group())  # 输出: a123b

五、实战案例

案例一:提取电子邮件地址
假设我们有一个包含文本的字符串,需要提取其中的电子邮件地址。

import retext = '''
Hello, my email is test@example.com. You can also reach me at another_email@domain.org.
'''pattern = r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}'
emails = re.findall(pattern, text)
print(emails)  # 输出: ['test@example.com', 'another_email@domain.org']

案例二:解析 HTML 标签
假设我们有一个包含 HTML 内容的字符串,需要提取其中的标签名。

import rehtml = '''
<html>
<head><title>Test Page</title></head>
<body><h1>Hello, World!</h1></body>
</html>

案例三:格式化电话号码
假设我们有一个包含电话号码的字符串,需要将它们格式化为 (xxx) xxx-xxxx 的形式。

import retext = '''
My phone number is 123-4567. You can also call me at 555-1234 or (678) 901-2345.
'''# 定义正则表达式模式,用于匹配电话号码
pattern = r'(\d{3})[-.\s]?(\d{3})[-.\s]?(\d{4})'# 使用 re.sub() 函数进行替换,格式化电话号码
formatted_text = re.sub(pattern, r'(\1) \2-\3', text)print(formatted_text)

输出:
My phone number is (123) 456-7890. You can also call me at (555) 123-4567 or (678) 901-2345.
在上面的例子中,正则表达式模式 (\d{3})[-.\s]?(\d{3})[-.\s]?(\d{4}) 用于匹配电话号码。其中:

  • \d{3} 匹配三个数字。
  • [-.\s]? 匹配一个可选的连字符(-)、点(.)或空格(\s)。
  • (\d{3}) 和 (\d{4}) 分别匹配接下来的三个和四个数字。

re.sub() 函数将匹配到的电话号码替换为格式化后的形式 (xxx) xxx-xxxx。注意,这里我们使用了捕获组(即圆括号中的部分),以便在替换字符串中引用它们。

六、总结

正则表达式是一种强大的文本处理工具,它能够帮助我们高效地匹配、查找、替换复杂的文本模式。Python 的 re 库为我们提供了便捷的正则表达式操作接口。通过掌握正则表达式的元字符、量词、分组、贪婪与非贪婪模式等基本概念,我们可以构建出各种复杂的匹配模式。同时,结合 re 库提供的各种函数,我们可以轻松实现文本匹配、搜索、替换等操作。

在实战中,正则表达式的应用非常广泛。例如,我们可以使用正则表达式提取电子邮件地址、解析 HTML 标签、格式化电话号码等。通过灵活运用正则表达式,我们可以大大提高文本处理的效率和准确性。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

炸场硅谷,大模型“蒸汽机”迎来“瓦特时刻”

作者 | 曾响铃 文 | 响铃说 中国大模型又在包括硅谷在内的全球AI圈炸场了。 两天前&#xff0c;幻方量化旗下AI公司深度求索&#xff08;DeepSeek&#xff09;&#xff0c;以及月之暗面相隔20分钟相继发布了自家最新版推理模型&#xff0c;分别是DeepSeek-R1以及Kimi 全新多…

备赛蓝桥杯之第十五届职业院校组省赛第二题:分享点滴

提示&#xff1a;本篇文章仅仅是作者自己目前在备赛蓝桥杯中&#xff0c;自己学习与刷题的学习笔记&#xff0c;写的不好&#xff0c;欢迎大家批评与建议 由于个别题目代码量与题目量偏大&#xff0c;请大家自己去蓝桥杯官网【连接高校和企业 - 蓝桥云课】去寻找原题&#xff0…

MyBatis最佳实践:提升数据库交互效率的秘密武器

第一章&#xff1a;框架的概述&#xff1a; MyBatis 框架的概述&#xff1a; MyBatis 是一个优秀的基于 Java 的持久框架&#xff0c;内部对 JDBC 做了封装&#xff0c;使开发者只需要关注 SQL 语句&#xff0c;而不关注 JDBC 的代码&#xff0c;使开发变得更加的简单MyBatis 通…

1. 基于图像的三维重建

1. 基于图像的三维重建 核心概念三维重建中深度图、点云的区别&#xff1f;深度图点云总结 深度图到点云还需要什么步骤&#xff1f;1. **获取相机内参**2. **生成相应的像素坐标**3. **计算三维坐标**4. **构建点云**5. **处理颜色信息&#xff08;可选&#xff09;**6. **去除…

将UI界面交给第三方库

当你了解了 Vue 项目构建和开发的基本知识后&#xff0c;我认为接下来你一定想亲自在构建出的项目中填充自己的业务和功能逻辑&#xff0c;因为目前其还是空白的。 但是这里我不会教你如何实现一个具体的业务和功能模块&#xff0c;因为每个人想要实现的东西都可能不尽相同。如…

深圳大学-计算机系统(3)-实验三取指和指令译码设计

实验目标 设计完成一个连续取指令并进行指令译码的电路&#xff0c;从而掌握设计简单数据通路的基本方法。 实验内容 本实验分成三周&#xff08;三次&#xff09;完成&#xff1a;1&#xff09;首先完成一个译码器&#xff08;30分&#xff09;&#xff1b;2&#xff09;接…

[Dialog屏幕开发] 屏幕绘制(文本/输入框/按钮控件)

阅读该篇文章之前&#xff0c;可先阅读下述资料 [Dialog屏幕开发] 设置GUI Status 菜单/GUI Title 标题https://blog.csdn.net/Hudas/article/details/145288453?spm1001.2014.3001.5501 上篇文章我们的屏幕已实现了如下功能 我们已经设置了GUI Status菜单以及GUI Title标题…

如何通过海外社交媒体平台提升品牌曝光度?

跨境电商和全球营销策略的核心之一是通过海外社交媒体平台提升品牌曝光度。为了实现这一目标&#xff0c;企业需要选定适合的社交平台并制定精准的营销策略。结合OKBrow指纹指纹浏览器的强大功能&#xff0c;您能够高效管理多个社交账户&#xff0c;避免平台识别账户之间的关联…

可替代CentOS 7的Linux操作系统选型

可替代CentOS 7的其他Linux操作系统选型 一、背景介绍二、主流操作系统调研2.1 企业级产品:Red Hat Enterprise Linux/CentOS Stream2.1.1 Red Hat Enterprise Linux2.1.2 CentOS Stream2.2 其他发行版:Debian/Ubuntu2.3 开源产品:AlmaLinux / RockyLinux2.3.1 AlmaLinux2.3…

每日一题洛谷P1423 小玉在游泳c++

#include<iostream> using namespace std; int main() {double s;cin >> s;int n 0;double sum 0;double k 2;while (sum < s) {sum k;n;k * 0.98;}cout << n << endl;return 0; }

DRG_DIP 2.0时代医院程序结构转型与数据结构优化研究

一、引言 1.1 DRG_DIP 2.0 改革背景与意义 医保支付方式改革在医疗保障制度改革中占据着极为关键的地位&#xff0c;是推动医疗领域变革的核心力量。它犹如一把精准的手术刀&#xff0c;对医疗资源的合理分配、医疗服务质量的稳步提升以及医疗费用的有效控制起着决定性作用。…

Redis支持数据类型详解

4 数据类型 Redis支持多种数据类型&#xff1a;string&#xff08;字符串&#xff09;&#xff0c;hash&#xff08;哈希&#xff09;&#xff0c;list&#xff08;列表&#xff09;&#xff0c;set&#xff08;集合&#xff09;、zset&#xff08;sorted set 有序集合&#x…

游戏设备升级怎么选?RTX4070独显,ToDesk云电脑更具性价比

过新年、添喜气&#xff01;正逢节期来临不知道各位是否都跟小编一样在考虑购置生活中的各样所需呐&#xff1f; 25年可谓是3A游戏大作之年&#xff0c;例如《GTA6》《文明7》《死亡搁浅2》《刺客信条&#xff1a;影》下半年落地的《塞尔达传说&#xff1a;新篇章》《生化危机9…

网络安全解决方案分享:推荐十款网络准入控制系统,保护企业网络安全

随着企业信息化进程的不断推进&#xff0c;企业网络安全面临的威胁愈加复杂。网络准入控制&#xff08;NAC, Network Access Control&#xff09;系统作为保障企业网络安全的核心技术&#xff0c;无论是防止外部攻击、阻止内部滥用&#xff0c;还是确保设备符合合规要求&#x…

WebSocket实现私聊私信功能

目录 后端pom.xmlConfig配置类Controller类DTO 前端安装相关依赖websocketService.js接口javascripthtmlCSS 效果展示简单测试连接&#xff1a; 报错解决方法1、vue3 使用SockJS报错 ReferenceError: global is not defined 后面将继续完善&#xff0c;待更新... 后端 pom.xml…

【PHP】部署和发布PHP网站到IIS服务器

欢迎来到《小5讲堂》 这是《PHP》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言安装PHP 稳定版本线程安全版解压使用 PHP配置 配置文件扩展文件…

电梯系统的UML文档07

从这个类中得到的类图&#xff0c;构划出了软件的大部分设计。 系统结构视图提供软件和整个系统结构最复杂的也是最优雅的描述。和通常的软件系统相比&#xff0c;在分布式嵌入系统中了解系统组件如何协同工作是非常重要的。毕竟&#xff0c;每个类图仅仅是一个系统的静态设计…

低代码系统-产品架构案例介绍、明道云(七)

今天分析另外一个零代码、低代码产品-明道云&#xff0c;跟所有低代码产品的架构图一样&#xff0c;高、大、炫、美。 依然是从下至上&#xff0c;从左到右的顺序。 开发层 搭建中心 表单、流程、报表、用户中心&#xff0c;还是这些内容&#xff0c;自定义打印很多平台都有&am…

Linux编译安装Netgen/NGSolve

本文记录Linux下编译安装Netgen/NGSolve的流程。 零、环境 操作系统Ubuntu 22.04.4 LTSVS Code1.92.1Git2.34.1GCC11.4.0CMake3.22.1oneAPI2024.2.1 一、安装依赖 1.1 VS Code 下载并安装VS Code&#xff0c;然后安装以下插件&#xff0c; Task Explorer Output Colorizer …

RabbitMQ的消息可靠性保证

文章目录 1.环境搭建1.common-rabbitmq-starter 配置防止消费者抢消息&#xff08;基础配置&#xff09;2.common-rabbitmq-starter-demo下创建一个生产者一个消费者 2.生产者可靠性1.开启消息超时重试机制2.生产者开启ConfirmCallback消息确认机制1.application.yml2.TestConf…