python5 正则表达式

Python中的正则表达式是一种强大的工具,用于在文本中搜索、匹配和处理特定模式的字符串。它们通过定义一种模式,使得可以轻松地搜索、替换、提取和验证文本数据,在Python中的正则表达式由re模块提供支持的。

正则表达式通常用于以下任务:

1.搜索与模式匹配的文本:你可以使用正则表达式来查找文本中是否包含特定模式的字符串,例如查找所有电子邮件地址或电话号码。

2.替换文本:正则表达式可以用于替换文本中的特定模式。例如,你可以将所有匹配的单词替换为另一个单词。

3.提取信息:你可以使用正则表达式从文本中提取特定模式的信息。例如,从文本中提取所有日期或数字。

4.验证输入:正则表达式可以用于验证输入是否符合特定的模式。例如,验证用户输入的电子邮件地址是否具有正确的格式。

1.匹配字符串

Python 中的re模块是一个用于字符串中正则表达式操作的标准库,以下代码演示了如何使用 re.match() 函数来查找字符串中与给定模式匹配的部分。

代码示例:

# match()函数的使用# \w匹配字母数字及下划线
# \s匹配任意空白字符,等价于 [\t\n\r\f].
# \d匹配任意数字,等价于 [0-9]
# [...]用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k'
# [^...]不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
# ^匹配字符串的开头
# {n}精确匹配n个前面表达式。
import re
content='Hello 123 4567 World_This is a Regex Demo'
print(len(content))  # 41# 使用re.compile()函数创建一个正则表达式模式对象pattern,模式是 r'^Hello\s\d\d\d\s\d{4}\s\w{10}'。该模式用来匹配以"Hello"开头,后面跟着一个空白字符,然后是三个数字,再一个空白字符,接着是四个数字,再是一个空白字符,最后是十个字母数字或下划线的字符串
pattern=re.compile(r'^Hello\s\d\d\d\s\d{4}\s\w{10}')
# 调用re.match(pattern, content)对content进行匹配,返回结果保存在result中
result=re.match(pattern,content)print(result)  # 打印匹配结果,结果是一个匹配对象
print(result.group())  # 打印匹配对象中与模式匹配的字符串
print(result.span())  # 打印匹配的位置,即匹配的字符串在原始字符串中的起始位置和结束位置

运行结果:

2.正则表达式匹配目标

#匹配目标#group()会输出完整的匹配结果,而group(1)会输出第一个被()包围的匹配结果
import re
content='Hello 1234567 World_This is a Regex Demo'  # 被匹配的文本字符串
pattern=re.compile(r'^Hello\s(\d{7})\s(\w{5})')  # 编译后的正则表达式对象,其含义是:# ^Hello:匹配以 "Hello" 开头的字符串# \s:匹配一个空白字符(例如空格)# (\d{7}):匹配七位数字,并将这七位数字作为一个分组。# \s:再次匹配一个空白字符# (\w{5}):匹配五个字母数字或下划线字符,并将这五个字符作为一个分组
result = re.match(pattern,content)  # 执行匹配
print(result)
print(result.group())
print(result.group(1))
print(result.group(2))
print(result.span())

运行结果:

3.正则表达式中的贪婪匹配与非贪婪匹配

在正则表达式中,贪婪匹配非贪婪匹配是两种常见的匹配策略,它们决定了正则表达式如何从字符串中匹配字符。**贪婪匹配(Greedy matching)**是正则表达式的默认行为。在贪婪匹配模式下,正则表达式会尽可能多地匹配字符,直到无法继续匹配为止。即使这种匹配超过了必要的最小匹配,它也会继续尝试匹配更多的字符。非贪婪匹配(Non-greedy matching),又称最小匹配或懒惰匹配,是通过在量词(如*, +, ?, {n,})后面加上一个?来启用的。在非贪婪模式下,正则表达式会尽可能少地匹配字符。

1.贪婪匹配

代码示例:

#贪婪匹配与非贪婪匹配# 01贪婪匹配
import re
content='Hello 1234567 World_This is a Regex Demo'
# 编译一个正则表达式模式pattern,模式是 r'^He.*(\d+).*Demo$'
# ^He:表示字符串以 "He" 开头。
# .*:表示匹配任意个(包括0个)任意字符,. 表示任意字符,* 表示任意次数,这是一个贪婪模式,会尽可能多地匹配字符
# (\d+):括号表示一个分组,\d+ 表示匹配一个或多个数字。由于前面的 .* 是贪婪的,所以这个表达式会尽可能少地匹配数字,只要能满足整个表达式的匹配
# .*Demo$:再次使用 .* 进行贪婪匹配,Demo$ 表示字符串以 "Demo" 结尾
pattern=re.compile(r'^He.*(\d+).*Demo$')
result=re.match(pattern,content)
print(result)  # 查看匹配结果,若匹配成功,则result是一个匹配对象;若失败,则为 None
print(result.group())  # 获取整个匹配的字符串,应输出'Hello 1234567 World_This is a Regex Demo'
print(result.group(1))  # 获取第一个分组的内容,即 \d+ 匹配的部分。因为 .* 的贪婪性,它尽可能地匹配了除最后一个数字以外的所有内容,所以group(1)应该只包含 '7'

运行结果:

2.非贪婪匹配

代码示例:

#02 非贪婪匹配
import re
content='Hello 1234567 World_This is a Regex Demo'
# He:匹配文本中的"Hello"的开头的"He"
# .*?:这是一个非贪婪的匹配,匹配尽可能少的任意字符直到遇到下一个符合模式的字符。因为它后面跟着\d+,所以它会停在数字开始的地方
# (\d+):这是一个捕获组,用于匹配一个或多个数字(\d+),并将这些数字作为一个分组保存,以便后面可以单独访问。
# .*:匹配从数字之后到字符串末尾前的任意字符
# Demo$:匹配字符串末尾的"Demo",$表示字符串的结束。
pattern=re.compile(r'He.*?(\d+).*Demo$')
result=re.match(pattern,content)
print(result)
print(result.group())
print(result.group(1))  # group(1)返回第一个捕获组的内容,在这个例子中,是字符串中的第一串数字1234567。

运行结果:

3.注意

需要注意的是,如果匹配的结果在字符串结尾,.*?就有可能匹配不到任何内容,因为它会匹配尽可能少的字符,例如:

import re
content='https://www.baidu.com/search/error.html'
result1=re.match(r'^https.*search/(.*)',content)  # 贪婪匹配模式
result2=re.match(r'https.*search/(.*?)',content)  # 非贪婪匹配模式
print("result1:  ", result1.group(1))
print("result2:  ",result2.group(1))

运行结果:

4.正则表达式中的修饰符

正则表达式可以包含一些可选标志修饰符来控制匹配的模式,而修饰符被指定为一个可选的标志。以下代码演示了如何使用正则表达式的修饰符来控制匹配的模式,特别是re.S修饰符的用法。

#修饰符import re
content = '''Hello 1234567 World_This
is a Regex Demo'''# r'^He.*?(\d+).*?Demo$':这是正则表达式模式:
# ^He:^表示匹配必须从字符串的开始处开始,He则匹配字符串开始的"Hello"中的"He"
# .*?:非贪婪模式匹配任意字符,尽可能少的匹配直到下一个符合条件的字符
# (\d+):捕获组,匹配一个或多个数字
# .*?:再次使用非贪婪模式匹配任意字符,直到遇到最后的"Demo"
# Demo$:匹配字符串的末尾,必须以"Demo"结束
# re.S(或re.DOTALL):这个修饰符使.特殊字符能够匹配任何字符,包括换行符(默认情况下,.不匹配换行符)
pattern=re.compile(r'^He.*?(\d+).*?Demo$',re.S)
result=re.match(pattern,content)
print(result.group(1))  # 打印第一个捕获组的内容,即字符串中的数字1234567# 由于使用了re.S修饰符,正则表达式可以跨越多行来找到匹配项。如果没有这个修饰符,.字符就不能匹配换行符,导致匹配失败。在这个例子中,使用re.S允许.*?匹配包括换行符在内的任意字符,从而正确地匹配并捕获所需的数字

运行结果:

5.转义匹配

使用Python的正则表达式库来匹配具有特殊字符的字符串。

代码示例:

# 转义匹配
import re
content='(百度)www.baidu.com'
# \(百度\):因为圆括号()在正则表达式中是特殊字符(用于定义捕获组),所以需要使用反斜杠\进行转义,使其表示字面意义上的括号
# www\.baidu\.com:同样的,点.也是一个特殊字符,它通常用来匹配除换行符之外的任何单个字符。在这里,我们需要匹配字面上的点,因此使用\.进行转义
pattern=re.compile(r'\(百度\)www\.baidu\.com')
result=re.match(pattern,content)
print(result.group())

运行结果:

6 search()方法匹配字符串

# search()
import re
content = 'Extra stings Hello 1234567 World_This is a Regex Demo Extra stings'pattern=re.compile('He.*?(\d+).*Demo')
# 使用search方法在content字符串中搜索第一个符合pattern定义的模式的匹配。不同于match方法,search不要求模式从字符串的开头开始匹配,它会在整个字符串中搜索匹配
result=re.search(pattern,content)
print(result.group())
print(result.group(1))

运行结果:

7.使用正则表达式根据要求匹配歌手和歌曲

import re
# html这个字符串包含了HTML代码片段,其中包括了一个包含音乐列表的 <div> 元素
html = '''<div id="songs-list"><h2 class="title">经典老歌</h2><p class="introduction">经典老歌列表</p><ul id="list" class="list-group"><li data-view="2">一路上有你</li><li data-view="7"><a href="/2.mp3" singer="任贤齐">沧海一声笑</a></li><li data-view="4" class="active"><a href="/3.mp3" singer="齐秦">往事随风</a></li><li data-view="6"><a href="/4.mp3" singer="beyond">光辉岁月</a></li><li data-view="5"><a href="/5.mp3" singer="陈慧琳">记事本</a></li><li data-view="5"><a href="/6.mp3" singer="邓丽君"><i class="fa fa-user"></i>但愿人长久</a></li></ul>
</div>'''# 正则表达式模式:
# <li.*? 匹配一个 <li> 标签及其可能的其他属性。
# active 匹配 class 属性中包含了 active 字符串的 <li> 元素。
# singer="(.*?)" 匹配 singer 属性值中的歌手名字。
# >(.*?)</a> 匹配了 <a> 标签中的文本内容,也就是歌曲名字。
# html 是待匹配的字符串。
# re.S 是一个标志,指定了在匹配中应该将换行符也视为普通字符。
result=re.search('<li.*?active.*?singer="(.*?)">(.*?)</a>',html,re.S)if result:print(result.group(1), result.group(2))

运行结果:

8.正则表达式中的sub()方法

使用Python中re模块的 sub()方法,用于替换字符串中与指定正则表达式模式匹配的部分。

代码示例:

#sub()方法
import re
content = '54aK54yr5oiR54ix5L2g'
# 这行代码使用了re模块的sub()方法来替换字符串content中匹配正则表达式模式\d+的部分为空字符串
# \d+ 是一个正则表达式模式,匹配一个或多个数字字符。
# ''是要替换匹配部分的内容,这里是空字符串,表示删除匹配到的数字
# content是待处理的字符串。
result=re.sub('\d+','',content)
print(result)

运行结果:

9.正则表达式处理日志内容

# 定义一个字符串变量log,其中包含一个日志条目,记录了日期、时间、日志级别和消息内容
log='2017-06-06 15:06:16,148 - root - DEBUG - logger debug message'
print(log.split('-'))  # '-'是指定的分隔符,split()方法将根据这个分隔符来拆分字符串。将日志条目中的每个部分分隔开,并以列表的形式打印出来。

运行结果:

10.正则表达式中的findall()函数

# findall() 函数,用于在给定的字符串中查找所有与指定正则表达式模式匹配的部分。import re# 这行代码定义了一个字符串content,其中包含了一个HTML锚点链接。HTML锚点链接是一种在网页中创建超链接的方式,它允许用户点击链接跳转到同一页面的不同位置。这些位置通常是页面上的特定部分,例如标题、段落或者其他元素。
content='<a href="http://www.baidu.com">baidu</a>'
# 使用 re.compile()函数创建一个正则表达式对象 pattern,该对象用于匹配HTML锚点链接的<a>标签
# <a href="(.*?)">(.*?)</a>是一个正则表达式模式,它匹配了一个<a>标签,其中包含了href属性和链接文本
# (.*?) 是非贪婪匹配,用于捕获 href 属性值和链接文本
pattern=re.compile('<a href="(.*?)">(.*?)</a>')
# findall()函数在给定的字符串content中查找所有与正则表达式模式匹配的部分,并返回一个包含所有匹配项的列表
result=re.findall(pattern,content)
print(result)
print(result[0])  # 打印出了结果列表中的第一个匹配项
print(result[0][0])  # 打印出了第一个匹配项中的第一个捕获组,即链接的href属性值。href属性是 HTML<a>元素中的一个属性,用于指定超链接的目标地址(Hypertext REFerence)

运行结果:


以上内容总结自网络,整理不易,如有帮助欢迎转发,我们下次再见!

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

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

相关文章

UE4_材质_雨滴涟漪效果ripple effect_ben教程

学习笔记&#xff0c;不喜勿喷&#xff01;侵权立删&#xff0c;祝愿生活越来越好&#xff01; 雨水落下时会产生这些非常漂亮的同心环波纹&#xff0c;我们要做的第一件事是创建一个单个的圆环遮罩动画&#xff0c;我们希望环在开始的时候在中心很小&#xff0c;然后放大&…

音频基础知识和音频指标

音频基础知识 声音 声音&#xff08;sound)是由物体振动产生的声波。物体在一秒钟之内振动的次数叫做频率&#xff0c;单位是赫兹&#xff0c;字母Hz。人耳可以识别的声音频率在 20 Hz~20000 Hz之间&#xff1b; 声音三要素&#xff1a; 响度 响度&#xff0c;…

kaggle notebook和jupyter notebook读取csv

kaggle本地比赛用打开notebook的示例代码可以获取当前比赛的文件数据路径&#xff0c;进而后续直接复制读取 jupyter notebook读取csv 直接下载数据集到电脑上&#xff0c;并用本地路径读取就行。

无线备网,保障连锁零售数字化运营

为了提升运营效率、改进客户体验&#xff0c;零售商们不断引入新的数字化工具和平台&#xff0c;包括数字化收银、客流统计、客户关系管理系统等。现代化智慧零售的运营更加依赖于稳定、高效的网络连接&#xff0c;数字化网络不仅是提升运营效率和客户体验的关键&#xff0c;还…

HTML+CSS+PHP实现网页留言板功能(需要创建数据库)

话说前头&#xff0c;我这方面很菜滴。这是我网页作业的一部分。 1.body部分效果展示&#xff08;不包括footer&#xff09; 2、代码 2.1 leaving.php&#xff08;看到的网页&#xff09; <!DOCTYPE html> <html lang"en"> <head> <met…

分数限制下,选好专业还是选好学校

目录 1.概述 1.1.综合考虑 1.2.个人经验分享 2.专业解析 2.1. 计算机科学与技术 2.2. 英语 2.3. 法学 2.4.专业VS学校 2.5.建议 3.名校效应分析 3.1. 名校声誉&#xff08;品牌效应&#xff09; 3.2. 资源获取 3.3. 学术氛围 3.4. 就业优势 3.5.小结 4.好专业和…

【启明智显产品分享】Model4 工业级HMI芯片详解(三):高安全、防抄板

Model4 工业级HMI芯片详解系列专题&#xff08;三&#xff09;【高安全、防抄板】 随着物联网和智能设备的快速发展&#xff0c;设备安全认证的需求日益迫切。硬件安全认证和保护在确保设备和身份安全中发挥着不可替代的作用&#xff0c;需要与软件安全相结合&#xff0c;共同构…

vue修改node_modules打补丁步骤和注意事项_node_modules 打补丁

1、vue-pdf问题解决及patch-package简介&#xff1a;https://www.jianshu.com/p/d1887e02f8d6 2、使用“黑魔法”优雅的修改第三方依赖包&#xff1a;https://zhuanlan.zhihu.com/p/412753695 3、使用patch-package定制node_modules中的依赖包&#xff1a;https://blog.csdn.…

git使用摘樱桃的方式,实现特定需求进行提交合并

文章目录 先checkOut到主要的分支(需求提交到这) 然后双击点别的需求分支,对提交内容选定 进行摘樱桃操作 然后双击回到主要分支,会发现那2个提交内容代码已经在主要分支的本地里,选中其 右键选择Squash Commits进行合并 标注自己的需求标题提交名更改后, 最后进行push推送到…

defer+recover机制处理错误

问题&#xff1a;多个协程工作&#xff0c;其中一个协程出现panic&#xff0c;导致程序崩溃 解决办法&#xff1a;利用deferrecover捕获panic进行处理&#xff0c;即使协程出现错误&#xff0c;主线程仍然不受影响可以继续执行 package mainimport ("fmt""tim…

洛谷——P2824 排序

题目来源&#xff1a;[HEOI2016/TJOI2016] 排序 - 洛谷https://www.luogu.com.cn/problem/P2824 问题思路 本文介绍一种二分答案的做法&#xff0c;时间复杂度为&#xff1a;(nm)*log(n)*log(n).本题存在nlog(n)的做法&#xff0c;然而其做法没有二分答案的做法通俗易懂. 默认读…

gitlab升级16.11.3-ee

背景 这是事后一段时间补充记录的博客。 升级目的&#xff1a;修补漏洞CVE-2024-4835 未经认证的威胁攻击者能够利用该漏洞在跨站脚本 (XSS) 攻击中&#xff0c;轻松接管受害者账户。 gitlab版本为14.6.2-ee升级至16.11.3-ee 思路 翻阅文档找升级方法及升级版本路径。使用…

AI智能盒子助力打造垃圾发电AI应用标杆!

垃圾焚烧发电作为一种新型的垃圾处理方式&#xff0c;能将其转化为电能&#xff0c;实现资源的再利用&#xff0c;成为实现节能环保的重要方式之一。为有效落实环境、安全、健康及社会责任管理体系&#xff0c;知名垃圾发电投资运营商光大环保能源致力于广泛利用科技&#xff0…

生成高保真度3D数字人化身:打造你的专属虚拟形象

在数字化时代,我们的虚拟形象正变得越来越重要。现在,一项前沿技术正将这一领域推向新的高度——生成高保真度的3D数字人化身。这项技术不仅可以将你的形象以3D形式呈现,更能赋予它生命,让你的虚拟形象拥有丰富的表情和动作。 一、技术简介 这项技术就像是一个高级的3D照…

信息系统项目管理师 | 信息系统安全技术

关注WX&#xff1a;CodingTechWork 信息安全概念 安全属性 秘密性&#xff1a;信息不被未授权者知晓。完整性&#xff1a;信息是正确的、真实的、未被篡改的、完整无缺。可用性&#xff1a;信息可以随时正常使用。 安全分层 设备安全 设备的稳定性&#xff1a;在一定时间…

openh264 Pskip 模式决策过程源码分析

skip模式 视频编码中的 “skip” 模式是一种优化技术&#xff0c;用于提高编码效率&#xff0c;减少不必要的编码工作。当编码器确定某个宏块&#xff08;Macroblock, MB&#xff09;在当前帧和参考帧之间没有显著的运动或变化时&#xff0c;可以采用skip模式。以下是skip模式的…

汽车IVI中控开发入门及进阶(二十七):车载摄像头vehicle camera

前言: 在车载IVI、智能座舱系统中,有一个重要的应用场景就是视频。视频应用又可分为三种,一种是直接解码U盘、SD卡里面的视频文件进行播放,一种是手机投屏,就是把手机投屏软件已视频方式投屏到显示屏上显示,另外一种就是对视频采集设备(主要就是摄像头Camera)的视频源…

leetcode144. 二叉树的前序遍历

一、题目描述&#xff1a; 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 二、输入输出实例&#xff1a; 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]…

移动app必须进行安全测试吗?包括哪些测试内容?

移动App已经成为我们日常生活中不可或缺的一部分&#xff0c;无论是社交娱乐还是工作学习&#xff0c;我们都离不开这些精心设计的应用程序。然而&#xff0c;随着移动App的广泛普及和使用&#xff0c;其安全性问题也逐渐浮出水面。为了确保用户数据的安全和减少潜在的风险&…

数智化浪潮下的零售品牌商品计划革新

在数字化和智能化交织的时代背景下&#xff0c;零售品牌的商品计划正在经历一场前所未有的革新。这场革新不仅改变了商品计划的方式和流程&#xff0c;更重塑了零售品牌的竞争格局和市场地位。 一、数智化&#xff1a;零售品牌的新引擎 在快速变化的市场环境中&#xff0c;零…