用人话讲计算机:Python篇!(十二)正则运算+re模块

目录

一、正则表达式

(1)什么是正则表达式

(2)它的结构及使用

示例:

1.字符 . (←这里有个小点哦)

2.字符 | 

3.字符 [ ] 

4.字符^

5.字符\d

(3)补充:表示数量

示例:

1.字符+

2.字符*

3.字符?

4.字符{n}

二、贪婪模式与非贪婪模式

(1)贪婪模式

(2)非贪婪模式

三、捕获组

四、re模块

(1)re库函数一览

(2)具体用法示例

1.re.findall(pattern,string,flags)

2.re.compile(pattern,[flags])

3.re.match(pattern,string,flags = 0)

4.re.search(pattern,string,flags = 0)

5.group 和 groups 函数

6.re.sub(pattern,replace,string,count=0,flags=0)

7.re.split(pattern,string,maxsplit = 0,flags = 0)


本节内容较长,有一定难度,还请耐心观看~~~

一、正则表达式

(1)什么是正则表达式

标准解释:正则表达式,又称规则表达式,它是一种文本模式,同时也是计算机科学的一个概 念,其中包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符 ")。

正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符 串,通常被用来检索、替换那些符合某个模式(规则)的文本。

简单来说,它就像一种“搜索语言”,它允许你通过特定的符号搜索你想要的文本

比如,你面前有一大堆文本文字,这时你就可以通过代码搜索找出你想要的有价值的文本

(2)它的结构及使用

正则表达式由两部分构成:一个是普通字符,一个是特殊字符。

所谓普通字符,就是a,b,c……z和A,B,C……Z这些英文字母、数字0到9、标点符号。

所谓特殊字符,又叫元字符,它包括:

看不懂,别急,直接后面看示例

字符作用
.匹配除\n 之外的任何单个字符。
|匹配两侧任意表达式
[ ]匹配里面的字符
^匹配以^之后字符开头的字符串
[^][^abc]表示非a或非b或 非c的单个字符
\d匹配一个数字字符,等价于[0-9]
\D匹配一个非数字字符,等价于[^0-9]
\s匹配任何空白字符,包括空格、制表符、换页符等等。
\S匹配任何非空白字符。等价于[^\f\n\r\t\v]
\w匹配任何单词字符,包括下划线。等价于“[A-Z和a-z和0-9_]”
\W匹配任何非单词字符。等价于“[^A-Za-z0-9_]”
\f匹配一个换页符
\n匹配一个换行符
\r匹配一个回车符

示例:

前言:正则表达式要用到re模块哦~~~

1.字符 . (←这里有个小点哦)

它的作用是,匹配除\n 之外的任何个字符。

这里用到了re模块的findall(a,b)函数 ,作用是 在b中搜索字符串a,然后以列表类型返回符合的字符串

例如:

import re
a=re.findall('张.',"张三,李四,王五,张六七")
print(a)

我们可以看到,需要匹配的字符串是 张. 翻译过来就是,匹配 张+张后面一个单字符。

所以,系统输出:

['张三', '张六']

当然你要是想匹配张和后面俩字符,就可以改成 张..  (←俩点)

就变成:

import re
a=re.findall('张..',"张三,李四,王五,张六七")
print(a)

系统输出:

['张三,', '张六七'] 

2.字符 | 

它的作用是,匹配两侧任意表达式,如果不存在,则不返回

比如:

import re
a=re.findall('cat|dog',"i have a cat and a dog")
print(a)

系统输出:

['cat', 'dog']

3.字符 [ ] 

它的作用是,匹配里面的字符

比如:

import re
a=re.findall('[ab]',"abcd齐齐")
print(a)

系统输出:

['a', 'b']

当然如果 [ ] 里有\n之类的话,为防止将 \ 被误解为转义符,最好是前面加个r,如:r‘[ab]’

4.字符^

他的作用是,匹配以^之后字符开头的字符串

如下面代码:^hello就是匹配以hello开头的字符串 

import re
a = re.findall('^hello', "hello world")
print(a)

系统输出:

['hello'] 

5.字符\d

它的作用是,匹配一个数字字符,等价于[0-9]

import re
a = re.findall(r'\d',"我的电话号码是110")
print(a)

输出:

['1', '1', '0']

注意,这里要用上了 r  防止 \  被误解哦~~

相信通过这5个例子,你应该初步掌握了,那么再回过头看那个表格是不是清楚多了

(3)补充:表示数量

当然了,正则表达式不仅只有上面那些。

它的特殊符还包括以下这些:

(还是一样,看不懂直接看示例)

字符作用
+匹配前面的子表达式一次或多次。
*匹配前面的子表达式零次或多次。
匹配前面的子表达式零次或一次。
{n}n是一个非负整数,匹配确定的n次。
{n,}n是一个非负整数,至少匹配n次。
{n,m}m和n均为非负整数,其中n<=m。最少匹配n次且最多匹 配m次。
{,n}n是一个非负整数,至多匹配n次。

示例:

1.字符+

匹配前面的子表达式一次或多次

比如下面代码,a+,就相当于将开头是a的全部找出来

import re
print(re.findall('a+',"abcadefaaghaaa"))

系统输出:

['a', 'a', 'aa', 'aaa']

当然,上面可能说的不太准确,准确的来说,是将一个以a为开头,一个或多个a为结尾的找出来,我们可以看下面这个例子,ab+来理解一下:

import re
print(re.findall('ab+',"abcadefabaghabbcaba"))

系统输出:

['ab', 'ab', 'abb', 'ab']

我们可以看到它将一个以a为开头,一个或多个b为结尾的字符找了出来,简单来说,

就是除了最后面的字符b可以是一个或者很多个,但你前面的a必须是一个。

我们再来看一个例子理解一下,如abc+

import re
print(re.findall('abc+',"abcadeabbcababcc"))

系统输出:

['abc', 'abcc']

这里就是将一个以ab为开头,一个或多个c为结尾的字符找出来。

当然,标准的解释并不是这样,这只是对匹配一次或多次人话解释版本。

2.字符*

匹配前面的子表达式零次或多次

如果你能理解字符+,那么字符*也很好理解,比如下面代码:

import re
print(re.findall('ha*', "wo-hahaahh"))

系统输出:

['ha', 'haa', 'h', 'h']

我们用人话理解匹配零次或多次,就是将一个以h为开头,零个或多个a为结尾的找出来

3.字符?

匹配前面的子表达式零次或一次

如代码:

import re
print(re.findall('ha?',"wo-hahaahh"))

系统输出:

['ha', 'ha', 'h', 'h']

这里用人话理解匹配零次或一次,就是将一个以h为开头,零个或一个a为结尾的找出来

4.字符{n}

匹配确定的n次

我们经过理解,所谓的匹配几次就是,将一个以甲为开头,以几个乙为结尾的找出来

那么这里,也是一样的。比如我们匹配三次ab,那就是一个a开头,三个b为结尾的:

import re
print(re.findall('ab{3}',"ababbabbbabbbb"))

输出:

['abbb', 'abbb']

如果这个你能理解,相信{n,m}什么的,看看上面的表格的功能介绍,你也能理解了吧。

二、贪婪模式与非贪婪模式

所谓贪不贪婪啊,其实就是你要匹配多少个。

你想匹配的多了,那就是贪婪模式,想匹配少点,那就叫非贪婪模式喽~~

(1)贪婪模式

我们经过上面的学习,是不是已经发现计算机每次都默认匹配多次了,比如字符+和*之类。

对,所以啊,出现诸如:“{m,n}”、“{m,}”、“?”、“*”和“+”之类的,那都默认是贪婪模式。

我们在上面已经学习清楚了,就不再多赘述贪婪模式。

现在来将一个概念:回溯

标准解释:在匹配过程中,如果后面的部分无法匹配成功,贪婪模式会进行回溯, 即让出已经匹配成功的一部分字符,以便使整个表达式能够匹配成功。

有没有感觉很熟悉,这不就是我一直说的人话解释吗:将一个以甲为开头,以几个乙为结尾的找出来。

简单来说,就是我去匹配ab,在一串字符abbb中,字符+匹配,第一次匹配,我匹配到了ab,然后我想接着匹配,我想找a,但是没有啊,所以我就回溯,就是不要第一个已经匹配成功的字符a了,我就找b就行了,所以最后输出abbb

以上便是贪婪模式。

当然,如果关于回溯你没有太懂,没关系,这不重要,你只要记住我的人话版,一样能写代码。

(2)非贪婪模式

非贪婪模式与贪婪模式相反,它会在匹配成功的前提下,尽可能少地匹配字 符。

还是比如,我在一串字符abbb中用字符+去匹配ab,在非贪婪模式下,我只会得到ab

这还是很好理解的。

非贪婪模式的表示:在字符后面加一个?

比如ab+?、ab*?、ab??、ab{3,5}?

我们来看一个代码,加深理解:

import re
print(re.findall('ab*?',"abbbbbbbbcd"))
print(re.findall('ab+?',"abbbbbbbbcd"))
print(re.findall('ab??',"abbbbbbbbcd"))
print(re.findall('ab{3,5}?',"abbbbbbbbcd"))    #这里的5碰上?就相当于没用了

输出:

['a']
['ab']
['a']
['abbb'] 

三、捕获组

先说说什么是捕获组?

捕获组就是一个可以让你从一个字符串中提取出多个有用的子字符串的东西

简单来说呢,就是把我们找出来的字符串分成一个一个组。

捕获组,就是我们用( )括起来的东西,这样就被提取为了一个单独的“组”

多说无用,来看一个代码:

import re
print(re.findall(r'\w+:\d+',"Alex:1994,Sunny:1996"))
print(re.findall(r'(\w+):\d+',"Alex:1994,Sunny:1996"))
print(re.findall(r'(\w+):(\d+)',"Alex:1994,Sunny:1996"))

依次输出:
['Alex:1994', 'Sunny:1996']
['Alex', 'Sunny']
[('Alex', '1994'), ('Sunny', '1996')]

解释:

第一行:\w+:\d+意思是查找格式为  字符:数字  的字符

第二行:(\w+):\d+ 加上括号后,就将\w+捕获成一个组了,此时就只会输出被捕获的字符

第三行:(\w+):(\d+)都加上括号,就捕获了两个组,所以只输出捕获的两个组,我们可以看到相必第一个,此时没有了冒号


当然,以上只是捕获组的简单用法,稍后在re模块中,我们再详细介绍它。 

四、re模块

调用方法:import re

(1)re库函数一览

(2)具体用法示例

1.re.findall(pattern,string,flags)

解释:

pattern:正则表达式或要匹配的字符

string:一大串字符串内容

flags:一些参数,可以达成如忽略大小写进行匹配等的目的。

上文都是用这个函数的,这里不过多论述。

这里主要说说flags参数,它有如下几个参数:

使用时,可写成诸如 re.findall(r'ab*',"abbbbbbbbcd",re.I)

2.re.compile(pattern,[flags])

它主要是可以将正则表达式对象复用,避免了每次调用时都重新编译正则表达式,提高了效率。

import re
# 编译正则表达式
pattern = re.compile(r'\d+')
# 使用编译后的正则表达式对象进行匹配
result = pattern.findall('There are 123 apples and 45 bananas.')
print(result) 

输出:

['123', '45']

3.re.match(pattern,string,flags = 0)

解释:

pattern:正则表达式或要匹配的字符

string:一大串字符串内容

flags:同1中的参数

这里它其实和re.findall的用法是一样的,唯一不同的是:

  • re.match() 只检查字符串的起始部分,如果起始部分与正则表达式匹配,返回一个匹配对象。
  • re.findall() 会扫描整个字符串,返回所有符合正则表达式的部分,返回一个包含所有匹配项的列表。

比如:

result = re.match(r'\d+','apples 123')
print(result)  # 输出 None

 tips:哪是起始部分,看的是空格哦

4.re.search(pattern,string,flags = 0)

参数原理同re.match和re.findall一样。

而re.search与他们不同的是:扫描整个字符串,查找第一个匹配的子串。如果找到匹配,返回一个匹配对象;如果没有匹配,返回 None

5.group 和 groups 函数

先说group()

它用于返回匹配到的整个字符串。

参数默认为 0,表示获取整个字符内容。

参数为1,则表示获取第一个捕获组  (没错,它又出现了,上文三中有解释哦)

参数为2,则表示获取第二个捕获组

……

参数为n,则表示获取第n个捕获组

当然,如果获取不存在的捕获组,就会报错。

比如,我们先设定好如下代码:

import re
pattern =r"(\w+)\s(\w+)"
string = "Hello World"

我们可以看到,上面的代码中有两个捕获组,然后输入下面的代码:

print(re.search(pattern, string).group())
print(re.search(pattern, string).group(1))
print(re.search(pattern, string).group(2))

输出:

Hello World        #默认参数为0,输出整个匹配到的字符
Hello                  #参数为1,输出1个捕获组
World                 #参数为2,输出2个捕获组

再说groups( )

它跟group()不同的是,groups()不管参数是几,都将捕获组全部给你以元组形式返回来

如果没有捕获组,group()会报错,而groups()会返回一个空元组。

比如,我们继续输入代码:

import re
pattern =r"(\w+)\s(\w+)"
string = "Hello World"
print(re.search(pattern, string).groups())
print(re.search(pattern, string).groups(2))

输出:

('Hello', 'World')
('Hello', 'World')

6.re.sub(pattern,replace,string,count=0,flags=0)

功能:使用一个字符串替换正则表达式匹配到的内容

pattern:正则表达式或要匹配的字符

replace:替换匹配字符串的字符串

string:一大串字符串内容

count:匹配的最大替换次数

flags:同前文解释

简单来说,就是替换字符用的,直接看代码:

import re
print(re.sub(':','-',"Alex:1994,Sunny:1996"))
print(re.sub(':','-',"Alex:1994,Sunny:1996",1))

输出:

Alex-1994,Sunny-1996
Alex-1994,Sunny:1996

解释:

第一个print里,意思是将“:”替换成“-”然后输出

第二个print里,因为后面有一个1,所以意思是将一个“:”替换成“-”然后输出

7.re.split(pattern,string,maxsplit = 0,flags = 0)

功能:按正则表达式匹配内容,切割目标字符串

pattern:正则表达式或要匹配的字符

string:一大串字符串内容

maxsplit:最大分割数,剩余部分作为最后一个元素输出

flags:同前文

比如下面代码: 

import re
print(re.split(r'\d{6}', 'BIT100081 TSU100084'))
print(re.split(r'\d{6}', 'BIT100081 TSU100084',1))

输出:

['BIT', ' TSU', ' ']
['BIT', ' TSU100084']

解释:

第一个print:意思是,匹配6次数字并删除掉

第二个print:意思是,仅在第一个组里,匹配6次数字并删掉

tips:各位可能发现,输出的最后多了一个‘ ’,这是为啥呢?

答:这是因为匹配到数字后,re.split() 会将匹配部分删除,并在其位置插入空字符串。如果字符串的结尾部分没有其他字符,那么在 re.split() 后会产生一个额外的空字符串。


致此,正则表达式讲解完毕~!

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

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

相关文章

Service Discovery in Microservices 客户端/服务端服务发现

原文链接 Client Side Service Discovery in Microservices - GeeksforGeeks 原文链接 Server Side Service Discovery in Microservices - GeeksforGeeks 目录 服务发现介绍 Server-Side 服务发现 实例&#xff1a; Client-Side 服务发现 实例&#xff1a; 服务发现介绍…

基于Python深度学习的【猫狗宠物识别】系统设计实现

一、简介 宠物识别系统&#xff0c;本系统使用Python作为主要开发语言&#xff0c;基于TensorFlow搭建卷积神经网络算法&#xff0c;并收集了37种常见的猫狗宠物种类数据集【‘阿比西尼亚猫&#xff08;Abyssinian&#xff09;’, ‘孟加拉猫&#xff08;Bengal&#xff09;’…

不能通过 ip 直接访问 共享盘 解决方法

from base_config.config import OpenSMB, SMB import os, time, calendar, requests, decimal, platform, fs.smbfsinfo_dict SMB.EPDI_dict info_dict[host] (FS03,10.6.12.182) info_dict[direct_tcp] True# smb OpenSMB(info_dict)print(ok)# 根据 ip 查询电脑名 impor…

10篇--图像噪点消除

概念 何为噪点&#xff1f; 噪点&#xff1a;指图像收到的一些干扰因素&#xff0c;通常是由图像采集设备、传输信道等因素造成的&#xff0c;表现为图像中随机的亮度&#xff0c;也可以理解为有那么一些点的像素值与周围的像素值格格不入。 常见的噪声类型 高斯噪声&#…

科研绘图系列:R语言绘制网络图和密度分布图(network density plot)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载图1图2图3图4图5图6图7图8系统信息参考介绍 R语言绘制网络图和密度分布图(network & density plot) 加载R包 library(magrittr) library(dplyr) library(…

数据结构——ST表

ST表的定义 ST表&#xff0c;又名稀疏表&#xff0c;是一种基于倍增思想&#xff0c;用于解决可重复贡献问题的数据结构 倍增思想 这里列举一个去寻找一个区间内的最大值的例子 因为每次会将将区间增大一倍&#xff0c;所以才被称之为倍增思想 &#xff0c;这种思想十分好用…

创建vue3项目步骤以及安装第三方插件步骤【保姆级教程】

&#x1f399;座右铭&#xff1a;得之坦然&#xff0c;失之淡然。 &#x1f48e;擅长领域&#xff1a;前端 是的&#xff0c;我需要您的&#xff1a; &#x1f9e1;点赞❤️关注&#x1f499;收藏&#x1f49b; 是我持续下去的动力&#xff01; 目录 一. 简单汇总一下创建…

【PlantUML系列】部署图(七)

一、部署图的组成部分 节点&#xff08;Node&#xff09;&#xff1a;使用node关键字定义一个节点&#xff0c;节点可以是服务器、数据库或其他硬件设备。组件&#xff08;Component&#xff09;&#xff1a;使用component关键字定义一个组件&#xff0c;组件可以是软件模块或服…

【JAVA】旅游行业中大数据的使用

一、应用场景 数据采集与整合&#xff1a;全面收集旅游数据&#xff0c;如客流量、游客满意度等&#xff0c;整合形成统一数据集&#xff0c;为后续分析提供便利。 舆情监测与分析&#xff1a;实时监测旅游目的地的舆情信息&#xff0c;运用NLP算法进行智能处理&#xff0c;及…

大屏开源项目go-view二次开发3----象形柱图控件(C#)

环境搭建参考&#xff1a; 大屏开源项目go-view二次开发1----环境搭建(C#)-CSDN博客 要做的象形柱图控件最终效果如下图&#xff1a; 其实这个控件我前面的文章也介绍过&#xff0c;不过是用wpf做的&#xff0c;链接如下&#xff1a; wpf利用Microsoft.Web.WebView2显示html…

内网是如何访问到互联网(H3C源NAT)

H3C设备NAPT配置 直接打开29篇的拓扑&#xff0c;之前都配置好了 「模拟器、工具合集」复制整段内容 链接&#xff1a;https://docs.qq.com/sheet/DV0xxTmFDRFVoY1dQ?tab7ulgil 现在是出口路由器可以直接访问61.128.1.1&#xff0c;下面的终端访问不了&#xff0c;需要做NAPT源…

Linux高性能服务器编程中的TCP带外数据梳理总结

Linux高性能服务器编程中的TCP带外数据梳理总结 文章目录 Linux高性能服务器编程中的TCP带外数据梳理总结1.TCP 带外数据总结2.第五章带外数据send.crecv.c 3.第九章带外数据send.cselect.c 4.第十章带外数据send.csig_msg.c 1.TCP 带外数据总结 至此&#xff0c;我们讨论完了…

PyTorch3D 可视化

PyTorch3D是非常好用的3D工具库。但是PyTorch3D对于可用于debug&#xff08;例如调整cameras参数&#xff09;的可视化工具并没有进行系统的介绍。这篇文章主要是想介绍我觉得非常使用的PyTorch3D可视化工具。 1. 新建一个Mesh 从hugging face上下载一个glb文件&#xff0c;例…

C# 网络编程--关于UDP 通信(二)

UDP (User Datagram Protocol) 是一种无连接的传输层协议&#xff0c;主要用于支持数据报文的传输。它的主要特点包括简单、高效、不保证可靠性和顺序。 1.UDP协议基本概念 1.udp基于IP的简单的协议&#xff0c;不可靠的协议 2.优点&#xff1a;简单、 轻量化、 传输速度高、…

Axure高保真数据可视化大屏图表组件库

推出了一款高保真数据可视化大屏图表组件库&#xff0c;旨在为用户提供丰富的图表类型&#xff0c;使数据呈现更加直观、生动。本文将详细介绍该组件库中的各类图表元件&#xff0c;包括面积图、折线图、柱状图、条形图、圆环图、雷达图、仪表图以及综合类图表&#xff0c;以满…

基于视觉的3D占用网络汇总

综述文章:https://arxiv.org/pdf/2405.02595 基于视觉的3D占用预测方法的时间线概述: 自动驾驶中基于视觉的3D占用预测的分层结构分类 2023年的方法: TPVFormer, OccDepth, SimpleOccupancy, StereoScene, OccupancyM3D, VoxFormer, OccFormer, OVO, UniOcc, MiLO, Multi-…

一区向量加权算法优化INFO-CNN-SVM卷积神经网络结合支持向量机多特征分类预测

一区向量加权算法优化INFO-CNN-SVM卷积神经网络结合支持向量机多特征分类预测 目录 一区向量加权算法优化INFO-CNN-SVM卷积神经网络结合支持向量机多特征分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现INFO-CNN-SVM向量加权算法优化卷积神经网络结…

渗透测试-前端验签绕过之SHA256

本文是高级前端加解密与验签实战的第1篇文章&#xff0c;本系列文章实验靶场为Yakit里自带的Vulinbox靶场&#xff0c;本文讲述的是绕过SHA256签名来爆破登录。 绕过 通过查看源代码可以看到key为 1234123412341234通过查看源代码可以看到是通过SHA256来进行签名的&#xff0…

深入了解IPv6——光猫相关设定:DNS来源、DHCPv6服务、前缀来源等

光猫IPv6设置后的效果对比图&#xff1a; 修改前&#xff1a; 修改后&#xff1a; 一、DNS来源 1. 网络连接 来源&#xff1a; 从上游网络&#xff08;如运营商&#xff09;获取 IPv6 DNS 信息&#xff0c;通过 PPPoE 或 DHCPv6 下发。 特点&#xff1a; DNS 服务器地址直…

CentOS7下,hive4.0.0安装部署

hive安装部署 为了简单起见&#xff0c;都安装到node1服务器上。&#xff08;集群&#xff1a;node1&#xff0c;node2&#xff0c;node3&#xff09; 环境&#xff08;已安装&#xff09;&#xff1a;Hadoop3.4.0&#xff0c;jdk-8u171 需要安装&#xff1a;MySQL8.4.3&…