初始Python篇(7)—— 正则表达式

找往期文章包括但不限于本期文章中不懂的知识点:

个人主页:我要学编程(ಥ_ಥ)-CSDN博客

所属专栏: Python

目录

正则表达式的概念 

正则表达式的组成

元字符

限定符 

其他字符

正则表达式的使用

正则表达式的常见操作方法

match方法的使用:

search方法的使用

findall方法的使用

sub方法的使用 

split方法的使用 

视频代码解读 

章节选择题

章节实战 


正则表达式的概念 

在上一篇文章中,我们学习了字符串这种数据类型,基于字符串而广泛使用的就是正则表达式了。我们先来看它的概念。正则表达式(Regular Expression,简称regex或regexp)是一种文本模式描述的工具,它使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在编程语言和文本编辑器中,正则表达式被广泛用于搜索、替换符合某个模式的文本。简单理解就是给了我们一个模板,然后根据这个模版来操作另外的字符串,进行匹配、替换等操作。

正则表达式的组成

既然我们说正则表达式是提供了一个模版,那这个模板是随便可以使用任意字符组成吗?肯定是不行的,其组成部分肯定也是有特殊的规定。组成模版的字符串除了正常使用的字符之外,还有另外一些特殊的字符。

元字符

元字符是具有特殊意义的专用字符。简单理解就是 有一些字符在正则表达式中被赋予了一些特殊的作用,并起名叫 "元字符"。下面我们来看常见的元字符。

元字符种类描述说明
^表示匹配的开始
$表示匹配的结束
.匹配任意字符 (除\n)
\w匹配字母、数字、下划线
\W匹配非 字母、数字、下划线
\s匹配任意空白字符(\n、\t 等)
\S匹配任意非空白字符
\d匹配任意十进制数(也就是0~9)

注意:可能有小伙伴不是很理解 "匹配" 这个词,这个词和 "寻找" 的意思差不多。匹配成功,就是成功找到了;匹配失败,就是没有找到。对于匹配成功之后,会发生什么,后续在解释。 

限定符 

限定符 是用来限定匹配的次数,也就是当一个字符反复出现时,我们不想全部都匹配只想匹配其中的三个或者四个子类的。

限定符种类描述说明
匹配前面的字符0次或1次
+匹配前面的字符1次或多次
*匹配前面的字符0次或多次
{n}匹配前面的字符n次
{n, }匹配前面的字符最少n次
{n, m}匹配前面的字符最小n次,最多m次

注意:限定符必须有前缀字符,也就是表明其要限制的字符是谁。例如,'\w?' 这个字符串如果作为模版的话,就是在匹配一个字符串时,即使该字符串由很多个 字母、数字、下划线 组成,那最多也就能成功匹配一个。(匹配的结果暂时不管)

其他字符

其他字符描述说明
区间字符:[ ]匹配[ ]中所指定的字符
排除字符:^匹配不在[ ]内的指定字符
选择字符:|匹配 "|" 左右的任意字符
转义字符与Python中的转义字符是一样的
[\u4e00 - \u9fa5]匹配任意一个汉字(日常生活中基本都涵盖)
分组:()改变限定符的作用

详细解释:

1、 区间字符:[ ],匹配过程中,当遇到 [ ] 内的字符时,就会匹配成功。

2、排除字符:^,这其实就是 区间字符 的取反,匹配过程中,遇到 [ ] 内不存在的字符时,就会匹配成功。区间字符与排除字符经常是一起出现的,因为排除字符是基于区间字符的。但排除字符是存在于区间字符之内的。

3、选择字符:|,这个与Python中的 or 操作符类似,只要满足其中一个条件即可。但不存在类似于"短路"的现象。

4、转义字符就是我们在刚开始学习Python时,学习的转义字符。例如,这个字符是元字符的一种,但是加上 \ 之后,这个 "." 就是一个普通字符了。

5、[\u4e00-\u9fa5]:在匹配字符的过程中,如果遇到了 某些字符对应的Unicode码值 在 上述的范围之内,就表明这个是 中文字符,且匹配成功了。

6、分组():这个就类似于 圆括号 对于 操作符的作用,可以实现运算的先后顺序,这里是实现匹配的先后顺序。例如,six l fourth,只能匹配到 six 与 fourth,但是如果加上(),就会变得不一样,( six | four ) th,这里能匹配的就是 sixth 或者 fourth了。相当于是先运算括号内的,在去运算括号外的(这里的就是括号里面的任选一个,括号外边的全部起作用),与操作符是类似的。 

正则表达式的使用

在Python中,如果要使用正则表达式的话,需要导入 re 模块。模块与包的概念是类似的,都是为了实现对某些代码的复用,这是面向对象的重要特征之一:封装。可能有的小伙伴第一门编程语言就是接触的Python,暂时还不了解这些概念,没关系,后面我们会接着学习的。我们只需要知道简单的将模块看成包就行了。

正则表达式的常见操作方法

当我们导入 re 模块之后,就可以进行正则表达式的相关操作了,但具体的操作,还得使用该模块中的方法,接下来详细来学习一下。

方法描述说明
re.match(pattern,string,flags=0)用于从字符串的开始位置进行匹配,如果起始位置匹配成功,结果为Match对象,否则结果为None。
re.search(pattern,string,flags=0)用于在整个字符串中搜索第一个匹配的值,如果匹配成功,结果为Match对象,否则结果为None。
re.findall(pattern,string,flags=0)用于在整个字符串搜索所有符合正则表达式的值,结果是一个列表类型。
re.sub (pattern,repl,string,count,flags=0)用于实现对字符串中指定子串的替换
re.split(pattern,string,maxsplit,flags=0)字符串中的split()方法功能相同,都是分隔字符串的

注意:

1、上述方法的所有pattern、string参数均为字符串类型,pattern 是模块字符串(定义匹配规则的),string 是待匹配的字符串(需要匹配的字符串)。flags=0 是可选参数,用于指定使用正则表达式时的匹配模式,如忽略大小写、多行匹配等。如果不需要特殊匹配模式,可以省略这个参数或者设置为0。我们一般都是直接忽略的。

2、match方法是用来匹配string的起始位置的,一旦起始位置匹配失败的话,即使后面存在可以匹配成功的子串,也会忽略,直接返回None。

3、re.sub() 方法中,repl 是替换字符串或者一个函数 。如果 repl 是一个函数,那么这个函数会被调用,传入每个匹配对象,返回值将用于替换匹配到的文本。count 是一个可选参数,指定了模式匹配后替换的最大次数。如果设置为 0,则所有匹配都会被替换。如果设置为一个正整数,则只替换前 count 次匹配

4、re.split() 方法中,maxsplit 这是一个可选参数,指定了分割的最大次数。

下面就来演示上述方法的使用。

match方法的使用:

import re# 这里的r是代表当前字符串中的转义字符是不能其作用的
# 例如,普通字符串:'\d' -> 表示是十进制的数字
# r普通字符串:r'\d' -> 表示两个字符 \ 与 d
pattern = r'hello' 
string1 = 'hello world'
string2 = '123 hello world'# match方法代表是从字符串的开始位置匹配
# string1的开始位置是包含hello的,可以匹配成功,因此match1返回一个Match对象
# string2的开始位置是不包含hello的,匹配失败,因此match2返回None
match1 = re.match(pattern, string1)
match2 = re.match(pattern, string2)print(match1)
print(match2)

运行结果:

匹配成功会返回一个Match对象,如果我们想要将 Match对象其中的某些部分给单独拿出来的话,就可以使用下面的方法:

print(match1.re) # 输出正则表达式
print(match1.string) # 输出待匹配的字符串
print(match1.group()) # 输出匹配成功的字符串
print(match1.span()) # 输出匹配成功的字符串的索引范围

运行结果: 

search方法的使用

import repattern = r'hello'
string1 = 'hello world'
string2 = '123 hello world'# search方法是在整个字符串中去匹配
# string1 与 string2 都是包含hello的,因此都可以匹配成功
match1 = re.search(pattern, string1)
match2 = re.search(pattern, string2)print(match1)
print(match2)

运行结果: 

findall方法的使用

import repattern = r'hello'
string1 = 'hello world--hello python'
string2 = '123 hello world--hello python'# findall方法也是在整个字符串中去匹配,但是它会匹配所有的结果,并返回一个列表
# string1 与 string2 都是包含hello的,因此都可以匹配成功
match1 = re.findall(pattern, string1)
match2 = re.findall(pattern, string2)print(match1)
print(match2)

运行结果: 

sub方法的使用 

import repattern = r'hello'
string1 = 'hello world--hello python'
string2 = '123 hello world--hello python'# sub方法是替换字符串中的匹配项
# 将string1与string2中的pattern部分替换为'I love'
match1 = re.sub(pattern, 'I love',string1)
match2 = re.sub(pattern, 'I love',string2)print(match1)
print(match2)

运行结果:

split方法的使用 

import repattern = r'--'
string1 = 'hello world--hello python'
string2 = '123 hello world--hello python'
string3 = '123 hello world  hello python'# split方法是按照pattern分割字符串,并返回一个列表
# string1 与 string2 都是包含--的,因此都可以分割成功
match1 = re.split(pattern, string1)
match2 = re.split(pattern, string2)
# string3 没有--,因此无法分割成功,但是最终的结果还是一个列表
match3 = re.split(pattern, string3)print(match1)
print(match2)
print(match3)

运行结果:

上面代码都是对上述方法的一个简单使用,具体还有一些细节这里也就不再演示,大家可以自己去编写代码实践。 

视频代码解读 

下面是关于 Python子木 up主的视频中一些可能有困惑的地方解释。

章节选择题

章节实战 

1、使用列表存储一些商品数据,使用循环遍历输出商品信息,要求对商品的编号进行格式化为6位,单价保留2位小数,并在前面添加人民币符号输出。

运行效果:

思路:直接将数据存储到列表中,然后我们直接去遍历列表即可。但是这里的难点就是这么样格式化输出这些数据。 

如果将 编号这些数据头也存储在列表中的话,有两点不合适的地方:1、列表是用来存储有效数据的,如果存着编号这些数据有点别扭,并且在后面处理的时候还要额外判断,十分麻烦;2、无法实现对齐输出。因此我们是先将数据头在最开始的地方输出。接着就是要将编号与单价按照要求格式化。最简单也是最暴力的方式,将对应位置的数据全部拿出来,直接进行修改。例如,在编号数据前面加上四个零即可;在单价前面加上 ¥,然后再对数据 .2f 的输出即可。

代码实现:

goods = [['01', '电风扇', '美的', 500],['02', '洗衣机', 'TCL', 1000],['03', '微波炉', '老板', 400]]
print('编号\t\t名称\t\t\t品牌\t\t单价')
# 遍历列表
for item in goods: # item是一个一维列表for j in item:print(j,end='\t\t')print()
# 在上述基础上,进行暴力的格式化操作即可
for item in goods: # item是一个一维列表# item[0] 是编号,item[3]是单价item[0] = '0000'+item[0]# 注意这里操作的单价要是int或float类型,而不能是字符串item[3] = '¥{0:.2f}'.format(item[3])print('编号\t\t\t名称\t\t\t品牌\t\t单价')
for item in goods: # item是一个一维列表for j in item:print(j,end='\t\t')print()

好啦!本期 初始Python篇(7)—— 正则表达式 的学习之旅 就到此结束啦!我们下一期再一起学习吧!

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

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

相关文章

使用 AI 辅助开发一个开源 IP 信息查询工具:一

本文将分享如何借助当下流行的 AI 工具,一步步完成一个开源项目的开发。 写在前面 在写代码时,总是会遇到一些有趣的机缘巧合。前几天,我在翻看自己之前的开源项目时,又看到了 DDNS 相关的讨论。虽然在 2021 年我写过两篇相对详细的教程&am…

Powershell学习笔记

声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…

《Java源力物语》-2.异常训练场

~犬📰余~ “我欲贱而贵,愚而智,贫而富,可乎? 曰:其唯学乎” \quad 在java.lang古域的一处偏僻角落,矗立着一座古老的训练场。青灰色的围墙上布满了密密麻麻的源力符文,这些符文闪烁着…

一起学Git【第二节:创建版本库】

创建库 这个库相当于一个目录,目录中的文件都被Git管理,会记录每个文件的修改删除和添加工作,便于之后随时跟踪历史记录还原到之前的某一版本。如何创建库呢?有两种方式,本地创建库和云端克隆一个库。 1.本地创建库 …

HarmonyOS NEXT 技术实践-基于基础视觉服务的多目标识别

在智能手机、平板和其他智能设备日益智能化的今天,视觉识别技术成为提升用户体验和智能交互的重要手段。HarmonyOS NEXT通过基础视觉服务(HMS Core Vision)提供了一套强大的视觉识别功能,其中多目标识别作为其关键技术之一&#x…

nginx-静态资源部署

目录 静态资源概述 静态资源配置指令 listen指令 server_name指令 精确匹配 ​编辑 ​编辑 使用通配符匹配 使用正则表达式匹配 匹配执行顺序 default_server属性 location指令 root指令 alias指令 root与alisa指令的区别 index指令 error_page指令 直接使用 …

时空信息平台架构搭建:基于netty封装TCP通讯模块(IdleStateHandler网络连接监测,处理假死)

文章目录 引言I 异步TCP连接操作II 心跳机制:空闲检测(读空闲和写空闲)基于Netty的IdleStateHandler类实现心跳机制(网络连接监测)常规的处理假死健壮性的处理假死方案获取心跳指令引言 基于netty实现TCP客户端:封装断线重连、连接保持 https://blog.csdn.net/z92911896…

Linux之RPM和YUM命令

一、RPM命令 1、介绍 RPM(RedHat Package Manager).,RedHat软件包管理工具,类似windows里面的setup,exe是Liux这系列操作系统里而的打包安装工具。 RPMI包的名称格式: Apache-1.3.23-11.i386.rpm “apache’” 软件名称“1.3.23-11” 软件的版本号&am…

aosp15 - Activity生命周期切换

本文探查的是,从App冷启动后到MainActivity生命周期切换的系统实现。 调试步骤 在com.android.server.wm.RootWindowContainer#attachApplication 方法下断点,为了attach目标进程在com.android.server.wm.ActivityTaskSupervisor#realStartActivityLock…

【漫话机器学习系列】017.大O算法(Big-O Notation)

大 O 表示法(Big-O Notation) 大 O 表示法是一种用于描述算法复杂性的数学符号,主要用于衡量算法的效率,特别是随着输入规模增大时算法的运行时间或占用空间的增长趋势。 基本概念 时间复杂度 描述算法所需的运行时间如何随输入数…

ensp 基于端口安全的财务部网络组建

ARP IP数据包通过以太网发送,但以太网设备并不能识别IP地址,它们是以MAC地址传输的。因此,必须把IP目的地址转换成MAC目的地址。在以太网中,一个主机要和另一个主机进行直接通信,必须要知道目标主机的MAC地址。 ARP&…

在 Ubuntu 上安装 Muduo 网络库的详细指南

在 Ubuntu 上安装 Muduo 网络库的详细指南 首先一份好的安装教程是非常重要的 C muduo网络库知识分享01 - Linux平台下muduo网络库源码编译安装-CSDN博客 像这篇文章就和shit一样,安装到2%一定会卡住,如果你不幸用了这个那真是遭老罪了 环境&#xf…

Idean 处理一个项目引用另外一个项目jar 但jar版本低的问题

当在idea中一个module A引用另外一个项目B的jar,但是从私服仓库中拉下的jar版本比较低导致编译不通过时,可以把项目B拉下来,重新编译打包jar跟新到本地的仓库 选中右边菜单的Maven 选中对应的项目B-》Lifecycle->双击 install也可以按住c…

Windows下安装Rabbit MQ

一、安装环境: 系统:windows11; 环境配置安装:otp_win64_25.3.2.14.exe(erlang类库); 服务应用安装:rabbitmq-server-3.12.4.exe; 二、erlang环境: 1.执行…

生态学研究中,森林生态系统的结构、功能与稳定性是核心研究

在生态学研究中,森林生态系统的结构、功能与稳定性是核心研究内容之一。这些方面不仅关系到森林动态变化和物种多样性,还直接影响森林提供的生态服务功能及其应对环境变化的能力。森林生态系统的结构主要包括物种组成、树种多样性、树木的空间分布与密度…

基于UNITY3D的照片墙演示项目技术分享

unity实现超大图片墙演示,由于拥有海量图片,使用了CPU 多线程,unity dots技术,图片组成文字部分,使用了点阵图技术,提取文字像素。 (关于点阵介绍) 点阵字体是把每一个字符都分成1616或2424个点…

设计模式-访问者设计模式

介绍 访问者模式(Visitor),表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变个元素的类的前提下定义作用于这些元素的新操作。 问题:在一个机构里面有两种员工,1.Teacher 2.Engineer 员…

ISO/IEC 25010:2023 系统和软件的质量模型(产品质量模型)

本文是对ISO/IEC 25010 2023年底第2版:系统和软件工程-系统和软件质量要求与评估 (SQuaRE)-产品质量模型一文的转载,此外还参考了ISO/IEC 25019:2023(en) Systems and software engineering — Systems and software Quality Requirements and Evaluatio…

【零基础保姆级教程】制作自己的数据集——Labelimg的安装与使用及常见的报错解决方法

1.是什么 LabelImg 是一个图形化的图像标注工具,主要用于机器学习和计算机视觉领域中的数据预处理。它是由 GitHub 用户 tzutalin 开发的开源项目,基于 Python 和 Qt 框架编写。LabelImg 允许用户手动为图像添加边界框(bounding boxes&#…

【java基础系列】实现数字的首位交换算法

在java中&#xff0c;手写实现一个数字的首位交换算法实现 实现效果 实现代码 核心业务代码 public static void main(String[] args) {int[] arr {1,2,3,4,5};int temp arr[0];for (int i 0; i < arr.length; i) {System.out.print(arr[i]);}System.out.println(&quo…