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 中,可以通过…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10pip3.10) 一:前言二:安装编译依赖二:安装Python3.10三:安装PIP3.10四:安装Paddlepaddle基础框架4.1…...

恶补电源:1.电桥
一、元器件的选择 搜索并选择电桥,再multisim中选择FWB,就有各种型号的电桥: 电桥是用来干嘛的呢? 它是一个由四个二极管搭成的“桥梁”形状的电路,用来把交流电(AC)变成直流电(DC)。…...