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.mfbz.cn/a/722196.html

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

相关文章

【HTML01】HTML基础-基本元素-附带案例-作业

文章目录 HTML 概述学HTML到底学什么HTML的基本结构HTML的注释的作用html的语法HTML的常用标签&#xff1a;相关单词参考资料 HTML 概述 英文全称&#xff1a;Hyper Text Markup Language 中文&#xff1a;超文本标记语言&#xff0c;就将常用的50多个标记嵌入在纯文本中&…

AI办公自动化:用通义千问批量翻译长篇英语TXT文档

在deepseek中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;现在要完成一个编写基于qwen-turbo模型API和dashscope库的程序脚本&#xff0c;具体步骤如下&#xff1a; 打开文件夹&#xff1a;F:\AI自媒体内容\待翻译&#xff1b; 获取里面所有TXT文档&#xff…

【博弈】843. 猜猜这个单词

本题涉及知识点 博弈 LeetCode843. 猜猜这个单词 给你一个由 不同 字符串组成的单词列表 words &#xff0c;其中 words[i] 长度均为 6 。words 中的一个单词将被选作秘密单词 secret 。 另给你一个辅助对象 Master &#xff0c;你可以调用 Master.guess(word) 来猜单词&…

APS-SCM联动:开创生产调度与供应链管理新篇章

在当今激烈的市场产品竞争环境下&#xff0c;企业不仅需要灵活高效的内部生产流程&#xff0c;更需具备对外部环境快速响应的能力&#xff0c;从而保证产品保质保量的生产完成&#xff0c;快速占据更多的市场份额。正是在这样的背景下&#xff0c;APS&#xff08;Advanced Plan…

从社交网络到元宇宙:Facebook的战略转型

随着科技的迅猛发展和数字化时代的深入&#xff0c;社交网络已不再局限于简单的信息交流和社交互动&#xff0c;而是逐步向更广阔、更深远的虚拟现实空间——元宇宙&#xff08;Metaverse&#xff09;转变。作为全球最大的社交网络平台之一&#xff0c;Facebook正在积极推动这一…

JS安全应用

JS应用 常见分析调试&#xff1a; -代码全局搜索 案例 登录框&#xff0c;可以看到发送用户名密码被JS加密 搜索Username&#xff0c;找到加密地方 logindata.UserName encodeURI(encrypt.encrypt(numMobile));logindata.Mobile encodeURI(encrypt.encrypt(numMobile));…

Python将Markdown格式转为HTML:轻松实现博客文章的自动化处理

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 引言 编写一篇高质量的博客文章并非易事&#xff0c;尤其是在排版和格式方面。Markdown作为一种轻量级的标记语言&#xff0c;为博主们提供了一种简洁、高效的写作方式。而Python作为一门强大的编程语言&#xff0c…

SpringBoot的入门案例

1、创建一个Maven工程 2、点击设置自动导入jar包 3、导入spring boot需要的依赖 打开sping boot的文档 导入依赖的pom.xml配置内容 4、创建一个spring boot的执行入口程序 5、写controller&#xff0c;service&#xff0c;dao的页面逻辑代码 6、测试&#xff0c;运行工程&#…

Repetition Improves Language Model Embeddings论文阅读笔记

文章提出了一种提高decoder-only LLM的embedding能力的方法&#xff0c;叫echo embeddingslast-token pooling&#xff08;即直接选最后一个token作为句子的embedding&#xff09;和直接mean pooling都不如文章提出的echo embedding&#xff0c;做法是把句子重复两次&#xff0…

Ardupilot开源代码之ExpressLRS性能实测方法

Ardupilot开源代码之ExpressLRS性能实测方法 1. 源由2. 测试效果3. 测试配置4. 总结5. 参考资料6. 补充 1. 源由 之前一直在讨论ExpressLRS性能的问题&#xff0c;有理论、模拟、实测。 始终缺乏完整的同一次测试的测试数据集&#xff0c;本章节将介绍如何在Ardupilot上进行获…

【Redis】内存回收和内存淘汰机制

1 概念 Redis 所有的数据都是存储在内存中的, 如果不进行任何的内存回收, 那么很容易出现内存爆满的情况。因此&#xff0c;在某些情况下需要对占用的内存空间进行释放。 Redis 中内存的释放主要分为两类 Redis 中内存的释放主要分为两类: 内存回收: 将过期的 key 清除&#…

算法训练与程序竞赛题目集合(L1)

目录 L1-001 Hello World! 输入格式: 输出格式: L1-002 打印沙漏 输入格式: 输出格式: 输入样例: 输出样例: L1-003 个位数统计 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; L1-004 计算摄氏温度 输入格式: 输出格式…

[保姆级教程]uniapp实现页面路由配置

文章目录 新建目录新建页面配置页面路由修改tabBar地址其他&#xff1a;在package.json中的pages配置详细 新建目录 先点击src–》新建–》目录 输入名称&#xff0c;并以此类推完成所有新建目录 新建页面 右击目录&#xff0c;点击新建–》vue文件 弹出弹框&#xff0c;…

【HTTPS】Wireshark导入密钥文件后仍无法解密https报文

个人搭建了一个HTTPS网站后&#xff0c;想通过Wireshark抓包https报文并解密。在本站查询了大量文章后&#xff0c;发现介绍的方法基本就分两步&#xff1a; 1、在本地Windows系统上新增系统环境变量"SSLKEYLOGFILE"&#xff0c;保存Chrome浏览器访问网站时使用的密…

SpringMVC系列五: SpringMVC映射请求数据

SpringMVC映射请求数据 &#x1f49e;获取参数值说明应用实例 &#x1f49e;获取http请求消息头&#x1f49e;获取JavaBean对象使用场景说明应用实例注意事项和细节 &#x1f49e;获取servlet api说明应用实例注意事项和细节 上一讲, 我们学习的是SpringMVC系列四: Rest-优雅的…

Intelij IDEA中Mapper.xml无法构建到资源目录的问题

问题场景&#xff1a; 在尝试把原本在eclipse上的Java Web项目转移至Intelij idea上时&#xff0c;在配置文件均与eclipse一致的情况下出现了如下报错&#xff1a; org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): cn.umbrella.crm_core.…

基于python的三维装箱可视化

背景介绍 本文主要介绍两种基于python的三维装箱可视化能力&#xff0c;第一种是基于mpl_toolkits的静态三维可视化代码&#xff0c;另外一种是基于matplotlib的动态可视化代码。 mpl_toolkits实现 Axes3D简介 mpl_toolkits 是 matplotlib 库的一个模块集合&#xff0c;它包…

STM32单片机USART串口详解

文章目录 1. 通信接口概述 2. 串口通信 3. 硬件电路 4. 电平标准 5. 串口参数及时序 5.1 数据帧的组成 5.2 起始位 5.3 数据位 5.4 校验位 5.5 停止位 5.6 波特率 5.7 数据帧传输过程示例 6. 串口时序 7. USART概述 8. USART框图 9. USART基本结构 10. 数据帧…

【DevOps】Kibana:数据可视化与探索的强大工具

目录 1、Kibana的基本概念 1.1 Elasticsearch集成 1.2 可视化类型 1.3 仪表板 2、 Kibana的主要功能 2.1 数据探索 2.2 可视化分析 2.3 仪表板管理 2.4 日志分析 2.5 监控与警报 3、 Kibana的使用场景 3.1 应用性能监控&#xff08;APM&#xff09; 3.2 安全信…

初始化一个Android项目时,Android Studio会自动生成一些文件和目录结构,以帮助你快速上手开发

当你初始化一个Android项目时&#xff0c;Android Studio会自动生成一些文件和目录结构&#xff0c;以帮助你快速上手开发。这些文件和目录各自有其特定的功能和用途。下面我为你解释一下这些自动生成的内容&#xff1a; 1. app 目录 这是你的应用模块的根目录&#xff0c;包…