Python-如何使用正则表达式

如何利用Python使用正则表达式

目录

正则表达式常用匹配规则

​编辑re库的使用

match()方法:

search()方法:

findall()方法 :

sub()方法:

compile()方法;

通用匹配

贪婪与非贪婪匹配

贪婪匹配

非贪婪匹配

修饰符

转义匹配


 

正则表达式是处理字符的强大工具,他有自己特定的语法结构,有了它,实现字符串的检索,替换,匹配验证都不在话下,不止如此,正则表达式可以从HTML中非常方便地提取想要的信息

正则表达式常用匹配规则

对于URL来说,正则表达式可以用下面的正则表达式来匹配:

[a-zA-Z]+://[^\s]*

这个正则表达式看上去十分的糟糕,其实里面都包含了特定的语法规则。比如,a-z代表匹配任意的小写字母,\s表示匹配任意的空白字符,*就代表匹配前面的字符任意多个,这一长串的正则表达式就是这么多平匹配规则的组合。

所以当写完正则表达式后,就可以拿他去一个字符串里匹配查找,不论这个字符串里有什么,这要符合我们写的规范,就统统可以找出来

下面列出常用的匹配规则:

参考来源:开发过程最全的正则表达式匹配中英文、字母和数字


re库的使用

正则表达式不是Python独有的,但Python的re库提供了整个正则表达式的实现,利用re库,就可以在Python中使用正则表达式,下面开始介绍它的一些常用方法:

match()方法:

match方法会尝试从字符的起始位置匹配正则表达式,如果匹配,就返回匹配成功;如果不匹配,就会返回None。示例如下:

import re
content = "Hello world 123 1234 Hello_my world"
print(len(content))
result = re.match('^Hello\s\w\w\w\w\w\s\d{3}\s\d{4}\s\w{8}',content)
print(result)

结果显式:


 

在这里,首先声明了一段字符串content,里面包含了英文字母,空白字符,数字等等,接下来,我们写了一段正则表达式:

^Hello\s\w\w\w\w\w\s\d{3}\s\d{4}\s\w{8}

用来匹配这个长字符。^是匹配字符串的开头,也就是说以Hello为开头;然后\s来匹配空白字符;\w匹配字母,5个\w代表匹配5个字母;后面还有阿拉伯数字,如果单纯只用\d\d\d来匹配,非常麻烦,所以\d后面可以跟着{3}代表匹配3个阿拉伯数字,以此类推写出了我们得到正则表达式。其实,我们并没有将字符串完整的匹配下来,但我们仍然可以进行匹配,只不过只是截取字符的一部分来进行匹配而已。

而在match()方法中,第一个参数传入正则表达式,第二个参数传入要匹配的字符。

在打印输出的结果,可以看到结果是re.Match对象,说明匹配成功,但是如果单纯的打印result。则会显示:

<re.Match object; span=(0, 29), match=‘Hello world 123 1234 Hello_my’>

所以一下有两种方法可以更好的进行查看

group()方法:可以输出匹配到的内容,结果是Hello world 123 1234 Hello_my
span()方法: 可以输出匹配的范围,结果是(0,29)

当然match()方法还可以将想要提取的字符串中,提出一部分内容;只需用()将想要的字符串括起来,被括起来的每一个子表达式会一次对应分组,调用group()方法传入分组的索引即可获取提取的结果,示例如下:

import re
content = "Hello world 123 1234 Hello_my world"
print(len(content))
result = re.match('^Hello\s\w\w\w\w\w\s\d{3}\s(\d+)\s\w{8}',content)
print(result)
print(result.group())
print(result.group(1))
print(result.span())

结果显示:


这里将group(1)打印,我们成功得到了1234,如果正则表达式中还有被()包裹的内容,那么可以依次使用group(2),group(3)来获取.

search()方法:

前面讲到match()方法是从字符串开头开始匹配的,一旦开头不匹配,那么整个匹配就是失败了,请看下面例子:

import re
content = "Hello world 123 1234 Hello_my world"
print(len(content))
result = re.match('ello\s\w\w\w\w\w\s\d{3}\s\d{4}\s\w{8}',content)
print(result)

对于上面代码,相对之前,我们只去掉了开头的H,则变成了以下的结果:

但是我们用search()来替换match(),可以看见:


因此,为了方便,我们可以尽量使用search()方法.

findall()方法 :

在介绍search()方法同时,我们发现,不管是match()方法,还是search()方法都只能返回匹配到的第一个内容,但是如果想要获取匹配正则表达式的所有内容,那该怎么办呢?这时就要借助findall()方法了.该方法会搜索整个字符,然后返回匹配正则表达式的所有内容.

因为用法类似,这里只介绍作用,就不用代码演示了

sub()方法:

除了使用正则表达式提取信息外,有时候还需要借助它来修改文本.比如,想把一串文本中的所有数字都去掉,如果只用字符串的replace()方法,那就太繁琐了,这时可以借助sub()方法.示例如下:

import re
content = "Hello world 123 1234 Hello_my world"
print(len(content))
result = re.sub('\d+','',content)
print(result)

结果显式:


这里只需要给第一个参数传入匹配的字符(这里是\d+,代表所有数字),第二个参数为替换的字符串(这里是’’,及空字符,我们需要将所有的数字删掉),第三个参数是原字符串.

可以看见所有的数字都被删除

compile()方法;

前面方法都是用来处理字符串的方法,最后介绍一下compile()方法,这个方法可以将正则字符串编译成正则表达式对象,以便在后面的匹配中复用,示例如下:

import re
content = "Hello world 123 1234 Hello_my world"
demo = re.compile('\d+')
result = re.sub(demo,'',content)
print(result)

结果显式:


这里我们和上题一样,是想要删除字符串里面的数字,和上题不同的是,我们利用compile()方法制作了正则表达式对象,在后面使用时,可以直接套用此对象,更加的方便,快捷

通用匹配

之前我们所写的正则表达式其实比较复杂,出现空白字符我们写\s,出现数字写\d,如果每次书写都这样繁琐,工作量会变得非常大.其实完全没有必要,因为还有一个万能匹配可以使用,那就是.* ,其中.可以匹配任意字符(除了换行符),*可以匹配前面的字符无数次,所以它们合在一起就可以匹配任意字符了,因此,我们可以改写:

import re
content = "Hello world 123 1234 Hello_my world"
print(len(content))
result = re.search('.*',content)
print(result)
print(result.group())
print(result.span())

结果如下:


.*非常简单的匹配到了我们所有的字符

贪婪与非贪婪匹配

贪婪匹配

在使用.*时,有时候并不能匹配到我们想要得到结果,请看下面例子:

import re
content = "Hello world 123 1234 Hello_my world"
print(len(content))
result = re.search('H.*(\d+)\s\d{4}\s\w{8}',content)
print(result)
print(result.group())
print(result.group(1))
print(result.span())

结果如下:


在这里,我们只想匹配到1前面的内容,再利用group(1)输出123,可是结果只显示了3,这是因为在贪婪模式下,.*会进可能的匹配更多的字符,.*后面是\d+,也就是至少一个字符,并没有指定多少个数字,因此,.*就尽可能的匹配更多的字符,这里就将12匹配了,给\d+留下来一个可满足条件的3了.

非贪婪匹配

前面,因为贪婪匹配,我们没有得到想要的结果,那该怎么办我们才可以匹配出自己想要的字符’123’呢?,其实,只需要使用非贪婪匹配就好了,非贪婪匹配的写法是.?,多了一个?,这样非贪婪模式会竟可能匹配少的字符,与贪婪模式相反,这样当匹配到Hello后面的字符时,后面就是数字了,而\d+正好可以匹配,.?就不会取匹配,交给后面的\d+了.

示例如下:

import re
content = "Hello world 123 1234 Hello_my world"
print(len(content))
result = re.search('H.*?(\d+)\s\d{4}\s\w{8}',content)
print(result)
print(result.group())
print(result.group(1))
print(result.span())

结果显式:


所以,做匹配的过程中因尽量使用非贪婪匹配,以免出现匹配结果缺失的情况.

修饰符

正则表达式可包含一些可选修饰符来控制匹配的模式,我们可以用实例来看看:

当我们使用修饰符时,结果如下:

import re
content = '''Hello world 123
1234 Hello_my world'''
print(len(content))
result = re.search('.*',content,re.S)
print(result)
print(result.group())
print(result.span())


可以看到,没有使用修饰符时,字符串没有匹配完全,而加了修饰符才可以正确显式

修饰符    描述
re.I    使匹配对大小写不敏感
re.L    做本地化识别(locale-aware)匹配
re.M    使能够多行匹配,影响 ^ 和 $
re.S    让点 . 匹配包括换行在内的所有字符
re.U    根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.
re.X    该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解

其中,较为常用的有re.S和re.I

转义匹配

正则表达式定义了许多匹配模式,如.用来匹配除了换行符之外的任意字符,但如果我们需要匹配的目标字符包含.该怎么办?这里就需要用到转义匹配了,当遇到用于正则匹配模式的特殊字符时,只需要在前面加反斜杠转义一下即可,例如可以用.来匹配.
 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ 教程 | 第5章 RabbitMQ 管理

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的编码爱好者 大家好&#xff0c;我是 DevO…

MATLAB | 如何绘制这样的描边散点图?

part.-1 前前言 最近略忙可能更新的内容会比较简单&#xff0c;见谅哇&#xff0c;今日更新内容&#xff1a; part.0 前言 看到gzhBYtools科研笔记(推荐大家可以去瞅瞅&#xff0c;有很多有意思的图形的R语言复现&#xff01;&#xff01;)做了这样一张图&#xff1a; 感觉很…

【论文阅读24】Better Few-Shot Text Classification with Pre-trained Language Model

论文相关 论文标题&#xff1a;论文标题&#xff1a;Label prompt for multi-label text classification&#xff08;基于预训练模型对少样本进行文本分类&#xff09; 发表时间&#xff1a;2021 领域&#xff1a;多标签文本分类 发表期刊&#xff1a;ICANN&#xff08;顶级会…

CASAIM自动化平面度检测设备3D扫描零部件形位公差尺寸测量

平面度是表面形状的度量&#xff0c;指示沿该表面的所有点是否在同一平面中&#xff0c;当两个表面需要连接在一起形成紧密连接时&#xff0c;平面度检测至关重要。 CASAIM自动化平面度检测设备通过搭载领先的激光三维测头和智能检测软件自动获取零部件高质量测量数据&#xf…

【LeetCode】最小路径和

最小路径和 题目描述算法流程编程代码 链接: 最小路径和 题目描述 算法流程 编程代码 class Solution { public:int minPathSum(vector<vector<int>>& grid) {int m grid.size();int n grid[0].size();vector<vector<int>> dp(m1,vector<in…

Ae 效果:CC Kernel

颜色校正/CC Kernel Color Correction/CC Kernel CC Kernel&#xff08;CC 卷积核&#xff09;效果主要用于图像的卷积处理&#xff0c;通过在卷积矩阵中设置不同的权重值&#xff0c;可以实现图像的锐化 Sharpen、模糊 Blur、查找边缘 Find Edges以及浮雕 Emboss等效果。 ◆ …

<C语言> 预处理和宏

1.预定义符号 __FILE__ //进行编译的源文件 __LINE__ //文件当前的行号 __DATE__ //文件被编译的日期 __TIME__ //文件被编译的时间 __STDC__ //如果编译器遵循ANSI C&#xff0c;其值为1&#xff0c;否则未定义这些预定义符号都是C语言内置的。 举个例子&…

谷歌: 安卓补丁漏洞让 N-days 与 0-days 同样危险

近日&#xff0c;谷歌发布了年度零日漏洞报告&#xff0c;展示了 2022 年的野外漏洞统计数据&#xff0c;并强调了 Android 平台中长期存在的问题&#xff0c;该问题在很长一段时间内提高了已披露漏洞的价值和使用。 更具体地说&#xff0c;谷歌的报告强调了安卓系统中的 &quo…

vue3常用API之学习笔记

目录 一、setup函数 vue2与vue3变量区别 二、生命周期 三、reactive方法 四、ref方法 1、简介 2、使用 3、ref与reactive 4、获取标签元素或组件 五、toRef 1、简介 2、ref与toRef的区别 六、toRefs 七、shallowReactive 浅reactive 1、简介 2、shallowreactiv…

Debian 12.1 “书虫 “发布,包含 89 个错误修复和 26 个安全更新

导读Debian 项目今天宣布&#xff0c;作为最新 Debian GNU/Linux 12 “书虫 “操作系统系列的首个 ISO 更新&#xff0c;Debian 12.1 正式发布并全面上市。 Debian 12.1 是在 Debian GNU/Linux 12 “书虫 “发布六周后推出的&#xff0c;目的是为那些希望在新硬件上部署操作系统…

JMeter发送get请求并分析返回结果

在实际工作的过程中&#xff0c;我们通常需要模拟接口&#xff0c;来进行接口测试&#xff0c;我们可以通过JMeter、postman等多种工具来进行接口测试&#xff0c;但是工具的如何使用对于我们来说并不是最重要的部分&#xff0c;最重要的是设计接口测试用例的思路与分析结果的能…

硬核来袭!中国AI大模型峰会“封神之作”,开发者们不容错过!

大家好&#xff0c;我是herosunly。985院校硕士毕业&#xff0c;现担任算法研究员一职&#xff0c;热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名&#xff0c;CCF比赛第二名&#xff0c;科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的…

PDF文件忘记密码,怎么办?

PDF文件设置密码分为打开密码和限制密码&#xff0c;忘记了密码分别如何解密PDF密码&#xff1f; 如果是限制编辑密码忘记了&#xff0c;我们可以试着将PDF文件转换成其他格式来避开限制编辑&#xff0c;然后重新将文件转换回PDF格式就可以了。 如果因为转换之后导致文件格式…

MapBox 做聚合图点位聚合效果实现教程

最近收到一个需求&#xff0c;要对 5000的点位进行展示。直接展示的话满屏幕都是点&#xff0c;效果太丑&#xff0c;于是想到了聚合&#xff0c;聚合有很多种方案。首先你可以手动的些代码来计算某个范围内的点的数量然后再把聚合的结果展示在这个范围的某个位置。这针对于简单…

PMP证书查询 ACP证书查询 PMP/ACP证书查询 PMP证书真伪查询 ACP证书真伪查询PMI证书查询

PMP证书查询 ACP证书查询 PMP/ACP证书查询 PMP证书真伪查询 ACP证书真伪查询PMI证书查询 一、查询步骤 1、地址&#xff1a; https://www.pmi.org/certifications/certification-resources/registry 2、查询截图&#xff1a; 2.1、证书类型如下&#xff1a; 3、查到证书 4、没…

python语言程序设计基础(第2版)课后答案

这篇文章主要介绍了python语言程序设计基础第二版课后答案&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获&#xff0c;下面让小编带着大家一起了解一下。 第一章 初识Python 1.1学好Python的关键 刷代码&#xff1a;寻找一个…

安科瑞电动机保护器产品在污水处理厂的应用-安科瑞黄安南

应用场景 功能 1&#xff09;排污泵经常会出现过载、缺相等问题&#xff0c;导致电机烧坏&#xff1b; 2&#xff09;为电动机提供完善的保护&#xff0c;并具备多种事件记录追忆功能&#xff1b; 3&#xff09;全电参量测量&#xff0c;包括但不限于三相电流、三相电压、有…

简约好看的帮助中心创建案例,赶紧点赞收藏!

在线帮助中心创建案例是提供用户支持和解决问题的有效方式之一。一个简约好看的帮助中心案例能够帮助用户快速找到需要的信息并解决问题&#xff0c;同时也能提升用户体验&#xff0c;增加点赞和收藏的可能性。 帮助中心创建案例分享&#xff1a; 酷学院&#xff1a; 酷渲&a…

这款轻量级规则引擎,真香!

大家好&#xff0c;我是老三&#xff0c;之前同事用了一款轻量级的规则引擎脚本AviatorScript&#xff0c;老三也跟着用了起来&#xff0c;真的挺香&#xff0c;能少写很多代码。这期就给大家介绍一下这款规则引擎。 简介 AviatorScript 是一门高性能、轻量级寄宿于 JVM &…

决策树的划分依据之:信息增益率

在上面的介绍中&#xff0c;我们有意忽略了"编号"这一列.若把"编号"也作为一个候选划分属性&#xff0c;则根据信息增益公式可计算出它的信息增益为 0.9182&#xff0c;远大于其他候选划分属性。 计算每个属性的信息熵过程中,我们发现,该属性的值为0, 也就…