11 Python的正则表达式
概述
在上一节,我们介绍了Python的文件操作,包括:打开文件、读取文件、写入文件、关闭文件、文件指针移动、获取目录列表等内容。在这一节中,我们将介绍Python的正则表达式。正则表达式是一种强大的工具,用于在文本中进行匹配、搜索、替换等操作,它提供了一种高效且灵活的方式来处理字符串。使用正则表达式可以大大提高字符串处理的效率,帮助我们在大量的文本数据中快速找到符合特定模式的字符串。
正则表达式的定义
正则表达式,又称正规表示法、正则式、regex,是一种文本模式,特别适合用来搜索、验证和替换符合特定模式的文本。它是由普通字符以及特殊字符组成的文字模式,该模式描述了一种字符串匹配的模式,可以用来搜索、替换、截取符合特定模式的字符串。
Python提供了一个内置的re模块,用于处理正则表达式。通过导入re模块,我们可以使用其中的函数来执行正则表达式操作。
正则表达式的语法
Python正则表达式的语法包括一些特殊的字符和元字符,这些字符可以用来表示特定的模式。下表列出了一些常用的Python正则表达式语法。
| 语法 | 含义 |
| . | 匹配除了换行符的任意字符 |
| ^ | 匹配字符串的开头 |
| $ | 匹配字符串的结尾 |
| * | 匹配前面的子表达式零次或多次 |
| + | 匹配前面的子表达式一次或多次 |
| ? | 匹配前面的子表达式零次或一次 |
| () | 匹配括号内的表达式,也表示一个组 |
| a|b | 匹配a或b |
| {n} | 匹配前面的子表达式精确n次 |
| {n,} | 匹配前面的子表达式至少n次 |
| {n,m} | 匹配前面的子表达式至少n次,但不超过m次 |
| [...] | 表示可以匹配的字符集合,比如:[A-Za-z]匹配任何一个字母或数字 |
| [^...] | 表示不匹配此字符集,比如:[^A-Za-z]匹配除了字母和数字之外的任何字符 |
| \d | 匹配任何十进制数字,相当于[0-9] |
| \D | 匹配任何非数字字符,相当于[^0-9] |
| \s | 匹配任何空白字符,包括空格、制表符、换页符等,等价于[\f\n\r\t\v] |
| \S | 匹配任何非空白字符,等价于[^ \f\n\r\t\v] |
| \w | 匹配任何字母、数字、下划线字符,等价于[a-zA-Z0-9_] |
| \W | 匹配任何非字母、数字、下划线字符,等价于[^a-zA-Z0-9_] |
另外,还有一些特殊的字符类和转义序列在正则表达式中也比较常见,可参看下表。
| 语法 | 含义 |
| \t | 制表符(Tab) |
| \n | 换行符 |
| \r | 回车符 |
| \f | 换页符 |
| \b | 退格符 |
| \\ | 反斜杠本身 |
| \' | 单引号本身 |
| \" | 双引号本身 |
| \0 | 空字符 |
| \xnn | ASCII码字符,其中nn是一个两位十六进制数 |
| \unnnn | Unicode字符,其中nnnn是一个四位的十六进制数 |
re.search函数
re.search函数在给定的字符串中搜索匹配正则表达式的内容,并返回一个匹配对象。如果匹配到多组,就返回第一组;如果没有找到匹配的内容,则返回None。
re.search函数的定义如下:
re.search(pattern, string, flags=0)
各个参数的含义如下:
pattern:需要匹配的正则表达式。
string:待搜索的字符串。
flags:控制正则表达式行为的标志,可选。可以使用多个标志,通过按位或(|)操作符组合。比如:可以使用re.IGNORECASE来忽略大小写,使用re.MULTILINE来分别对每一行进行匹配。
re.search函数返回的是一个匹配对象,如果没有找到匹配的内容,则返回None。当匹配成功时,匹配对象具有以下的属性。
group(index): 返回指定索引的分组,如果索引不存在,则返回整个匹配的文本。
groups(): 返回一个包含所有分组(索引号大于0的组)的元组。
start(index): 返回指定索引的分组在字符串中的开始位置。
end(index): 返回指定索引的分组在字符串中的结束位置。
span(index): 返回指定索引的分组在字符串中的开始和结束位置的元组。
如果匹配失败,以下方法会引发异常:
group(index): 试图获取一个不存在的组的匹配结果,将会引发异常。
start(index)、end(index)、span(index): 试图获取一个不存在的组的边界位置,将会引发异常。
我们可以通过下面的示例代码来理解re.search函数。
import retext = "Hello CSDN!"
result = re.search('(CSDN)', text)
if result:# 输出:Found: CSDN (6, 10)print("Found:", result.group(1), result.span(1))
else:print("Not found")text = 'be greater than ever'
result = re.search('(.*) greater (.*?) .*', text)
if result:# 输出:Found all: be greater than everprint ("Found all:", result.group())# 输出:Found group 1: beprint ("Found group 1:", result.group(1))# 输出:Found group 2: thanprint ("Found group 2:", result.group(2))
else:print("Not found")
re.match函数
re.match函数用于在字符串的开始处进行正则表达式匹配,并返回一个匹配对象。如果没有找到匹配的内容,则返回None。re.match函数与re.search函数的区别在于:re.match函数只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败并返回None;而re.search函数会匹配整个字符串,直到找到一个匹配的。
import retext = 'Hello CSDN'
result = re.match('Hello', text)
# 从字符串的开始处进行匹配,能找到,输出:Found: Hello
if result:print("Found:", result.group())
else:print("Not found")text = 'CSDN Hello'
result = re.match('Hello', text)
# 从字符串的开始处进行匹配,找不到,输出:Not found
if result:print("Found:", result.group())
else:print("Not found")text = 'hope_wisdom@csdn.net'
result = re.match(r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$', text)
# 校验是否为有效的电子邮件地址,输出:Found
if result:print("Found")
else:print("Not found")
re.findall函数
re.findall()函数用于在一个字符串中查找所有匹配的部分,并返回一个包含所有匹配部分的列表。
re.findall()函数的定义如下:
re.findall(pattern, string)
其中,pattern是正则表达式,用于匹配要查找的内容;string是要在其中查找匹配项的字符串。返回的列表中包含了所有匹配的部分,如果没有找到匹配项,则返回一个空列表。
import retext = "Hello, CSDN! Be greater than ever."
matches = re.findall(r'\b\w+\b', text)
# 输出:['Hello', 'CSDN', 'Be', 'greater', 'than', 'ever']
print(matches)
re.sub函数
re.sub()函数用于在字符串中使用正则表达式进行替换操作,函数会返回一个新字符串,其中匹配的字符串被替换为指定的替换对象。
re.sub()函数的定义如下:
re.sub(pattern, repl, string, count=0, flags=0)
各个参数的含义如下:
pattern:需要匹配的正则表达式。
repl:用于替换匹配到的字符串的替换对象。
string:要在其中进行替换操作的原始字符串。
count:指定替换的最大次数,可选。默认为0,表示替换所有匹配的字符串。
flags:控制正则表达式行为的标志,可选。可以使用多个标志,通过按位或(|)操作符组合。
在下面的示例代码中,我们使用re.sub()函数将字符串中的所有单词替换为"CSDN",正则表达式\b\w+\b匹配单词的边界和单词本身。
import retext = "Hello, world! Be greater than ever."
result = re.sub(r'\b\w+\b', 'CSDN', text)
# 输出:CSDN, CSDN! CSDN CSDN CSDN CSDN.
print(result)
re.compile函数
re.compile()函数用于将给定的正则表达式编译为一个可重用的正则表达式对象,函数会返回一个正则表达式对象,可以用于重复匹配或搜索操作。
re.compile()函数的定义如下:
re.compile(pattern, flags=0)
各个参数的含义如下:
pattern:要编译的正则表达式字符串。
flags:控制正则表达式行为的标志,可选。可以使用多个标志,通过按位或(|)操作符组合。
在下面的示例代码中,我们使用re.compile()函数将正则表达式\d\w\d编译为一个可重用的正则表达式对象,并使用该对象进行搜索操作。
import repattern = re.compile(r'\d+\w+\d+')
result = pattern.search('Hello 666OK999 CSDN')
# 输出:666OK999
print(result.group())
re.finditer函数
re.finditer()函数用于在字符串中查找正则表达式的匹配项,并返回一个迭代器,包含匹配结果。每个匹配结果都是一个Match对象,可以通过该对象的group()方法获取匹配的字符串。
re.finditer()函数的定义如下:
re.finditer(pattern, string, flags=0)
各个参数的含义如下:
pattern:要匹配的正则表达式模式。
string:要在其中查找匹配项的字符串。
flags:控制正则表达式行为的标志,可选。可以使用多个标志,通过按位或(|)操作符组合。
在下面的示例代码中,我们使用re.finditer()函数获得了一个匹配对象的迭代器,并遍历该迭代器输出了匹配字符串。
import retext = 'Hello 666 CSDN 999'
pattern = re.compile(r'\d+')
matches = pattern.finditer(text)
# 依次输出:666 999
for match in matches:print(match.group())
re.split函数
re.split()函数用于将字符串按照正则表达式进行分割,并返回一个分割后子串的列表。
re.split()函数的定义如下:
re.split(pattern, string, maxsplit=0)
各个参数的含义如下:
pattern:要用于分割字符串的正则表达式模式。
string:要分割的字符串。
maxsplit:指定最大分割次数,可选。如果指定了该参数,则最多会按照正则表达式分割maxsplit次。默认值为0,表示没有限制。
在下面的示例代码中,我们使用re.split()函数分割了字符串,并返回分割后子串的列表。
import retext = 'ocean-sky-continent'
result = re.split('-', text)
# 输出:['ocean', 'sky', 'continent']
print(result)
相关文章:
11 Python的正则表达式
概述 在上一节,我们介绍了Python的文件操作,包括:打开文件、读取文件、写入文件、关闭文件、文件指针移动、获取目录列表等内容。在这一节中,我们将介绍Python的正则表达式。正则表达式是一种强大的工具,用于在文本中进…...
关于工信部发布的app备案以及小程序备案流程
一、相关政策 通知:https://beian.miit.gov.cn/#/Integrated/lawStatute 腾讯备案:网站备案 首次备案-网站备案-文档中心-腾讯云 阿里备案:网站备案_ICP备案_备案迁移_备案-阿里云 二、遇到的问题 APP备案 安卓获取平台公钥方法…...
【高等数学基础知识篇】——不定积分
文章目录 一、不定积分的概念与基本性质1.1 原函数与不定积分的基本概念1.2 不定积分的基本性质 二、不定积分基本公式与积分法2.1 不定积分基本公式2.2 不定积分的积分法2.2.1 换元积分法2.2.2 分部积分法 三、两类重要函数的不定积分——有理函数与三角有理函数3.1 有理函数的…...
python使用鼠标在图片上画框
python rect.py 图片文件夹先左击左上角,再右击右下角,画出一个框结果保存在res文件夹rect.py import cv2, sys, ospathsys.argv[1] imcv2.imread(path) alos.listdir(path) al.sort() if not os.path.exists(res): os.makedirs(res)def getInfo(event,…...
算法通关村第十五关:青铜-用4KB内存寻找重复元素
青铜挑战-用4KB内存寻找重复元素 位运算在查找元素中的妙用 题目要求: 给定一个数组,包含从1到N的整数,N最大为32000,数组可能还有重复值,且N的取值不定,若只有4KB的内存可用,该如何打印数组中…...
SQL注入 - 宽字节注入
文章目录 SQL注入 - 宽字节注入宽字节注入前置知识宽字节靶场实战判断是否存在SQL注入判断位数判显错位判库名判表名判列名 SQL注入 - 宽字节注入 靶场 sqli - labs less-32 宽字节注入主要是绕过魔术引号的,数据库解析中除了UTF-8编码外的所有编码如:G…...
Flink基础
Flink architecture job manager is master task managers are workers task slot is a unit of resource in cluster, number of slot is equal to number of cores(超线程则slot2*cores), slot一组内存一些线程共享CPU when starting a cluster,job manager will allocate a …...
javaee spring aop 注解实现
切面类 package com.test.advice;import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*;//切面类 Aspect public class MyAdvice {//定义切点表达式Pointcut("execution(* com.test.service.impl.*.add(..))")public void pc(){}//B…...
Qt应用开发(基础篇)——按钮基类 QAbstractButton
一、前言 QAbstractButton类,继承于QWidget,是Qt按钮小部件的抽象基类,提供按钮常用的功能。 QAbstractButton按钮基类,它的子类(pushbutton、checkbox、toolbutton等)处理用户操作,并指定按钮的绘制方式。QAbstractBu…...
2023年最新的 前端面试题(个人总结)
目录 vue 1.vue2 和 vue3 的区别 2.vue2 和 vue3的原理 3.组合式api 和 选项式api 3. Proxy和object.defineproperty 4..v-show 与 v-if 的区别 5.计算属性和 watcher 6.虚拟DOM 7.key的作用是什么? 8.v-if 和 v-for 的优先级是什么? 9.vuex …...
服务器基本故障排查方法
1、加电类故障 定义 从上电(或复位)到自检完成这一段过程中电脑所发生的故障。可能的故障现象 1、 主机不能加电(如:电源风扇不转或转一下即停等)、有时不能加电、开机掉闸、机箱金属部分带电等; 2、 开机无显,开机报警; 3、 自检报错或死机、自检过程中…...
docker从零部署jenkins保姆级教程
jenkins,基本是最常用的持续集成工具。在实际的工作中,后端研发一般没有jenkins的操作权限,只有一些查看权限,但是我们的代码是经过这个工具构建出来部署到服务器的,所以我觉着有必要了解一下这个工具的搭建过程以及简…...
什么是 MVVM 模式?
MVVM 模式 官方解释:Vue 虽然没有完全遵循 MVVM 模型,但是 Vue 的设计也受到了它的启发。因此在文档中经常会使用 vm (ViewModel 的缩写) 这个变量名表示 Vue 实例。 什么是 MVVM 模式? MVVM 是一种新的开发模式,对比传统模式&…...
WebGL Varing变量的作用和内插过程,及执行Varing时涉及的图形装配、光栅化、颜色插值、片元着色器执行机制等详解
目录 前言 在 WebGL 或 OpenGL 中,“varying” 是一种用于在顶点着色器和片元着色器之间传递数据的特殊类型的变量。它允许在顶点着色器对数据进行处理后,在片元着色器中使用该处理后的数据进行进一步计算。 彩色三个点 编辑 彩色三个点示例代码…...
赢在起跑线:战略定位咨询带来的核心价值
在企业的发展之路上,三个核心问题始终伴随着我们:我们是谁?我们要做什么?我们要如何做?在业务的马拉松比赛中,开始时的位置至关重要。而战略定位咨询就是帮助企业赢在起跑线的关键。那么什么是战略定位?战略定位包含…...
【链表OJ 11】复制带随机指针的链表
前言: 💥🎈个人主页:Dream_Chaser~ 🎈💥 ✨✨刷题专栏:http://t.csdn.cn/UlvTc ⛳⛳本篇内容:力扣上链表OJ题目 目录 leetcode138. 复制带随机指针的链表 1. 问题描述 2.代码思路: 2.1拷贝节点插入到…...
Jenkins自动构建(Gitee)
Gitee简介安装JenkinsCLI https://blog.csdn.net/tongxin_tongmeng/article/details/132632743 安装Gitee jenkins-cli install-plugin gitee:1.2.7 # https://plugins.jenkins.io/gitee/releases获取安装命令(稍作变更) JenkinsURL Dashboard-->配置-->Jenkins Locatio…...
nginx离线安装
ngixn的离线安装(centos7) 需要的依赖 gcc、gcc-c pcre-8.42.tar.gz zlib-1.2.11.tar.gz openssl-1.1.1s.tar.gz perl-5.28.0.tar.gz 在进行nginx离线安装时,首先查看系统是否安装 gcc、gcc-c,若没有进行安装,请先进行安装 gcc -v #查…...
Oracle Merge Into ORA-00001: unique constaint violated问题
最近使用Datax同步进行定时数据同步,并在同步完之后进行回调sql进行统计操作。对应的ORACLE表结构如下: create table DATA_STAT_DAY ( DATA_DATE DATE, ID VARCHAR2(2), NAME VARCHAR2(2), CLASSNO VARCHAR2(2), SCORES NUMBER(16,0) );CREATE UNIQU…...
javaScript:DOM中的CSS操作
目录 1.style 属性获取元素写在行间的样式 2.getComputedStyle(元素对象,null)可以获取元素的非行间样式 3.案例(定义一个div和按钮,每点击一次按钮div宽度增加) 效果预览图 代码实现 在 JavaScript 中,可以通过…...
RAG 系列(十七):Agentic RAG——让 Agent 主导检索过程
Pipeline RAG 的沉默失败 前面十几篇一直在优化一件事:怎么让检索结果更好。更好的分块、更精准的排序、更聪明的问法、CRAG 纠偏、Graph RAG 关系遍历…… 但有一件事始终没变:无论检索结果好不好,都会被传给 LLM 生成答案。 Pipeline RAG 的流程是线性的、固定的: 问…...
突破存储限制:群晖DSM7下Synology Photos自定义文件夹挂载实战
1. 为什么需要自定义文件夹挂载 很多群晖用户升级到DSM7后都会遇到一个头疼的问题:Synology Photos默认把所有个人照片都存放在/home/Photos目录下,而这个目录实际上位于/homes共享文件夹中。随着照片数量不断增加,/homes所在存储空间很快就会…...
模拟IC设计避坑指南:用Cadence Virtuoso仿真,揭秘电流镜精度下降的3个元凶
模拟IC设计避坑指南:用Cadence Virtuoso仿真,揭秘电流镜精度下降的3个元凶 在模拟CMOS集成电路设计中,电流镜作为基础模块广泛应用于偏置电路、有源负载等场景。然而许多工程师在Cadence Virtuoso IC617中完成电流镜设计后,常会遇…...
实战指南:用UABEA高效解析Unity资源结构的5个关键要点
实战指南:用UABEA高效解析Unity资源结构的5个关键要点 【免费下载链接】UABEA c# uabe for newer versions of unity 项目地址: https://gitcode.com/gh_mirrors/ua/UABEA 在Unity开发的世界里,资源管理往往是项目优化中最棘手的一环。你是否曾经…...
Grad-CAM实战:用热力图透视神经网络的决策焦点
1. Grad-CAM技术初探:为什么我们需要热力图? 当你训练了一个图像分类模型,准确率高达95%,但你真的了解它是如何做出判断的吗?我曾在项目中遇到过这样的尴尬:模型把一只坐在草地上的哈士奇误判为"狼&qu…...
无代码物联网实战:基于ESP32与WipperSnapper的泳池水温监测方案
1. 项目概述:告别繁琐编程,用无代码方案守护泳池水温又到了打理泳池的季节,除了常规的清洁和化学平衡,水温其实是个挺关键的指标。水温不仅影响游泳的舒适度,也关系到泳池加热设备的能耗和泳池化学品的反应速率。以前想…...
MedAgentBench:大模型临床决策能力评估基准详解与应用
1. 项目概述:当大模型成为医疗决策的“实习生” 最近在医疗AI的圈子里,一个名为“MedAgentBench”的开源项目引起了不小的讨论。这个由斯坦福机器学习组(Stanford ML Group)发布的项目,其核心目标非常明确:…...
Godot游戏引擎与强化学习结合:从零构建AI智能体的实战指南
1. 项目概述:当游戏开发遇上强化学习如果你是一名游戏开发者,或者对游戏AI的实现抱有浓厚兴趣,那么“edbeeching/godot_rl_agents”这个项目绝对值得你花时间深入研究。简单来说,这是一个将当下最热门的强化学习技术与免费、开源的…...
从单体智能到组织智能:AgentOrg多智能体系统架构与实战
1. 项目概述:从单体智能到组织智能的范式跃迁最近在AI Agent领域,一个名为“AgentOrg”的开源项目引起了我的注意。这个由Angelopvtac发起的项目,其核心思想非常吸引人:它不再将AI Agent视为一个孤立的、执行单一任务的智能体&…...
OpenClaw-Subcortex:轻量级自动化任务编排与执行框架详解
1. 项目概述与核心价值最近在折腾一些自动化工具,发现一个挺有意思的项目叫openclaw-subcortex。乍一看这个名字,可能有点摸不着头脑,又是“爪子”又是“皮层下”的,感觉像是什么生物或者神经科学的东西。但实际上,这是…...
