python语法基础---正则表达式(补充)

🌈个人主页:羽晨同学 

💫个人格言:“成为自己未来的主人~” 

上一篇文章中,我们讲到了贪婪匹配和非贪婪匹配,我们在这篇文章中,主要讲的就是贪婪匹配和非贪婪匹配的剩下的部分,话不多说,让我们开始吧。

我们先来看几个例子,大家可以相一下这个打印出来的结果是什么。

import re
print(re.findall(r"a\w+",'afasfadasafa464646_fafdasda_dasdasdfb'))
print(re.findall(r"\w+b",'afasfadasafa464646_fafdasda_dasdasdfb'))
print(re.findall(r"a\w+b",'afasfadasafa464646_fafdasda_dasdasdfb'))

这个就是打印出来的结果。

这个前面第一个正则表达式的意思是说,从a开始,中间进行贪婪匹配,直到结束。

第二个正则表达式的意思直接进行贪婪匹配,然后到b结束。

第三个正则表达式的意思是说,从a开始,中间进行贪婪匹配,然后到b结束。

你看,虽然这三个打印出来的结果是相同的,但是,其中表达的意思并不相同。

我们再来看下一个例子:

print(re.findall(r"a\w+?",'afasfadasafa464646_fafdasda_dasdasdfb'))
print(re.findall(r"\w+?b",'afbsfadasafa464646_fafdasda_dasdasdfb'))
print(re.findall(r"a\w+?b",'afbsfadasafa464646_fafdasda_dasdasdfb'))

这个是我们这次打印出来的结果,你看是不是有很大的不同。

对于贪婪匹配后面加一个?,这样子就变成了非贪婪匹配。

所以,对于第一个正则表达式而言,要找到的,是所有以a开头的字符串,并且由于是非贪婪匹配,并不无限向后找,碰到下一个a的时候,就构成了一个新的字符串。

对于第二个正则表达式而言,找到的是所有以b结尾的字符串。

对于第三个正则表达式而言,找到的是所有的以a开头,以b结尾的字符串作为元素。

我们再来看下一组表达式

print(re.findall(r"a\w*?",'afasfadasafa464646_fafdasda_dasdasdfb'))
print(re.findall(r"\w*?b",'afbsfadasafa464646_fafdasda_dasdasdfb'))
print(re.findall(r"a\w*?b",'afbsfadasafa464646_fafdasda_dasdasdfb'))print(re.findall(r"a\w*",'afasfadasafa464646_fafdasda_dasdasdfb'))
print(re.findall(r"\w*b",'afasfadasafa464646_fafdasda_dasdasdfb'))
print(re.findall(r"a\w*b",'afasfadasafa464646_fafdasda_dasdasdfb'))

这个当中,其实需要强调的是,*表示的是0个或者多个,因为后面加上了?,所以只能找到a

我们再来看下一组代码。

import re
print(re.findall(r"\d+","fhig346-gh465464nm"))
print(re.findall(r"[a-z]+","fhig346-gh465464nm"))
# 正则1 |正则2
print(re.findall(r"\d+|[a-z]+","fhig346-gh465464nm"))

通过这个代码,我们可以了解到的是,这个|,其实就是或的意思。

我们来看下一组代码

import re
print(re.findall(r"(\d+)|[a-z]+","fhig346-gh465464nm"))
# ['', '346', '', '465464', '']
print(re.findall(r"\d+|([a-z]+)","fhig346-gh465464nm"))
print(re.findall(r"(\d+)|([a-z]+)","fhig346-gh465464nm"))

默认情况下,如果正则表达式中出现(),结合findall查找,最终的结果中只显示()的结果。这个也叫做捕获组

有捕获组,那肯定也存在着非捕获组,我们来看一下非捕获组的示例。

# b、非捕获组:(?:正则)
print(re.findall(r"(?:\d+)|[a-z]+","fhig346-gh465464nm"))
# ['fhig', '346', 'gh', '465464', 'nm']
print(re.findall(r"\d+|(?:[a-z]+)","fhig346-gh465464nm"))
# ['fhig', '346', 'gh', '465464', 'nm']

你看,这个就是非捕获组,在这种情况下面,()是不会起作用的。

练习,已知一个字符串data,检索其中合法的邮箱

data = 'yz@163.comhellodasdasda@sina.com146747@qq.com4654654@xxx.com'
import re
mall_list=re.findall(r"\w+@(?:163|126|qq|sina)\.com",data)
print(mall_list)

这样子,我们就拿到了我们想要的结果。

我们接下来讲一下正则表达式中的几个常用的函数。

1. compile():将正则字符串编译成正则对象,一般都是为了结合其他函数使用的2. match():用正则匹配指定字符串中的内容,如果匹配上,返回Match对象
如果未匹配上,则返回None
应用:判断用户名或密码是否合法3. search():用正则搜索指定字符串中的内容,如果匹配上,返回Match对象,如果未匹配,返回None
注意,只会查找一次4. findall():用正则搜索指定字符串中的内容,如果匹配上,返回非空列表,如果未匹配,返回空列表
注意:查找所有
应用:全局搜索数据,在爬虫中一般使用findall5.finditer():用正则搜索指定字符串中的内容,返回一个迭代器,
如果匹配上,则返回一个Match对象
注意,查找所有

下面,我们来写一下对应的应用这些函数的代码。

首先,我们来看第一个例子:

import re
r=re.findall(r"a\d","6a8ghjkasda3asdaa8")
print(r)
r=re.finditer(r"a\d","6a8ghjkasda3asdaa8")
print(r) 

在这个打印结果当中,第一个打印出来的是字典,第二个是迭代器对象。

那我们应该怎么获取迭代器当中的数据呢?

首先,使用循环。

# 方式一
for obj in r:print(obj)print(obj.group())  # 获取Match对象的文本内容
# <re.Match object; span=(1, 3), match='a8'>
# a8
# <re.Match object; span=(10, 12), match='a3'>
# a3
# <re.Match object; span=(16, 18), match='a8'>
# a8

方式二,使用next.

# 方式二
print(next(r)) # <re.Match object; span=(1, 3), match='a8'>
print(next(r)) # <re.Match object; span=(10, 12), match='a3'>
print(next(r)) # <re.Match object; span=(16, 18), match='a8'>
while True:try:obj=next(r)print(obj.group())except StopIteration as e:# 如果出现异常,则说明迭代器中的元素已经获取完毕break
# <re.Match object; span=(1, 3), match='a8'>
# <re.Match object; span=(10, 12), match='a3'>
# <re.Match object; span=(16, 18), match='a8'>

 接下来,我们来说一下split(),用正则指定的规则分割指定字符串,返回一个列表。

str1='one1two1three1four'
l1 = str1.split("1") # 字符串.split(分隔符),返回一个列表
print(l1) # ['one', 'two', 'three', 'four']str1='one1two2three3four'
l1=re.split(r'\d+',str1) # re.split(正则分割符,字符串)
print(l1) # ['one', 'two', 'three', 'four']l1=re.split(r'\d+',str1,2) # re.split(正则分割符,字符串,次数)
print(l1) # ['one', 'two', 'three3four']

 我们接下来讲一下sub和subn

sub是将正则匹配到的子字符串用指定字符串进行替换

str1="one111two111three111four"
l1=str1.replace("111","-")
print(l1) # one-two-three-four# 可以指定替换的次数
str2="one31324two46465three4651four"
l1=re.sub(r"\d+","-",str2)
print(l1) # one-two-three-fourstr2="one31324two46465three4651four"
l1=re.sub(r"\d+","-",str2,2)
print(l1) # one-two-three4651four

而subn返回的是一个元组,格式:(新字符串,替换的次数)

str2="one31324two46465three4651four"
l1=re.subn(r"\d+","-",str2,2)
print(l1) # ('one-two-three4651four', 2)str2="one31324two46465three4651four"
l1=re.subn(r"\d+","-",str2)
print(l1) # ('one-two-three-four', 3)

接下来,我们说一下match,search,findall之间的区别

r1=re.match(r"\d+",'as1das2')
print(r1)   # None 从左往右匹配
r1=re.search(r"\d+",'as1das2')
print(r1) # <re.Match object; span=(2, 3), match='1'>
r1=re.findall(r"\d+",'as1das2')
print(r1)  # ['1', '2']

 注意,在正则中不要随便使用空格

print(re.search(r"\d+[a-z]+","3sdaasda-dasdad4")) # \d+ 数字可以出现一个或者多个
print(re.search(r"\d + [a-z]+","3sdaasda-dasdad4")) # \d +空格可以出现一个或者多个

flags的用法

re.I表示不区分大小写

# # flags的用法
# # re.I表示不区分大小写
print(re.split(r"a","dashjkhadAdashjkdkajaHJKHKHJAdashjkdh",re.I))
# 为了区分flasg,尽量使用关键字参数的方式给flags传参
print(re.split(r"a","dashjkhadAdashjkdkajaHJKHKHJAdashjkdh",flags=re.I))

 好了,我们今天的文章就到这里,我们明天再见。

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

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

相关文章

Elasticsearch数据迁移(快照)

1. 数据条件 一台原始es服务器&#xff08;192.168.xx.xx&#xff09;&#xff0c;数据迁移后的目标服务器&#xff08;10.2.xx.xx&#xff09;。 2台服务器所处环境&#xff1a; centos7操作系统&#xff0c; elasticsearch-7.3.0。 2. 为原始es服务器数据创建快照 修改elas…

golang实现单例日志对象

原文地址&#xff1a;golang实现单例日志对象 – 无敌牛 欢迎参观我的个人博客&#xff1a;无敌牛 – 技术/著作/典籍/分享等 介绍 golang有很多日志包&#xff0c;通过设置和修改都能实现日志轮转和自定义日志格式。例如&#xff1a;log、zap、golog、slog、log4go 等等。 …

7. 一分钟读懂“单例模式”

7.1 模式介绍 单例模式就像公司里的 打印机队列管理系统&#xff0c;无论有多少员工提交打印任务&#xff0c;大家的请求都汇总到唯一的打印管理中心&#xff0c;按顺序排队输出。这个中心必须全局唯一&#xff0c;避免多个队列出现资源冲突&#xff0c;保证打印任务井然有序。…

【AI系统】布局转换原理与算法

布局转换原理与算法 数据布局转换目前已经越来越多地用于编译器的前端优化&#xff0c;将内部数据布局转换为后端设备友好的形式。数据布局转换主要影响程序的空间局部性&#xff0c;所谓空间局部性指的是如果一个内存位置被引用了一次&#xff0c;那么程序很可能在不远的将来…

GPS周和周内秒 UTC时 格林尼治时间

1.GPS周和周内秒介绍 GPS周和周内秒是全球定位系统&#xff08;GPS&#xff09;中用于时间表示的两个重要概念&#xff0c;它们共同构成了GPS时间系统。以下是对这两个概念的详细介绍&#xff1a; GPS周&#xff08;GPS Week&#xff09; GPS周是GPS系统内部所采用的时间单位…

Java-异常处理机制-try-catch

Java-异常处理机制 一、异常概述1、异常的抛出机制2、如何对待异常3、异常的体系结构3.1、Throwable3.2、Error和Exception3.3、编译时异常和运行时异常3.4、常见的异常有哪些&#xff1f; 二、异常的处理方式一 try-catch的使用1、过程1&#xff1a;抛2、过程2&#xff1a;抓3…

在Ubuntu22.04.5上安装Docker-CE

文章目录 1. 查看Ubuntu版本2. 安装Docker-CE2.1 安装必要的系统工具2.2 信任Docker的GPG公钥2.3 写入软件源信息2.4 安装Docker相关组件2.5 安装指定版本Docker-CE2.5.1 查找Docker-CE的版本2.5.2 安装指定版本Docker-CE 3. 启动与使用Docker3.1 启动Docker服务3.2 查看Docker…

【趋势红蓝交易】主图指标操盘技术图文展示,注意要点,通达信炒股软件指标

如上图&#xff0c;主图指标【趋势红蓝交易】&#xff0c;蓝色线下空头趋势&#xff0c;不进场操作或只做超短线的反弹行情。红线之上多头行情&#xff0c;顺势做多&#xff0c;波段和趋势多头操作。 多空操作区间K线变色功能&#xff0c;上涨区间红色K线&#xff0c;叠加紫色趋…

网络协议(TCP/IP模型)

目录 网络初识 网络协议 协议分层 协议拆分 分层 协议分层的优势 1.封装效果 2.解耦合 TCP/IP五层模型 协议之间配合工作&#xff08;详解&#xff09; 网络初识 网络核心概念&#xff1a; 局域网&#xff1a;若干电脑连接在一起&#xff0c;通过路由器进行组网。 …

基于图和个性化PageRank的RAG方法HippoRAG

HippoRAG是2024年5月的一篇论文《HippoRAG: Neurobiologically Inspired Long-Term Memory for Large Language Models》(github)&#xff0c;它受人脑长期记忆的启发(Hippo是海马体英文单词的前缀)&#xff0c;用知识图谱(KG)来存储知识&#xff0c;并用检索编码器和个性化Pag…

【电子设计】WifiESP8266无线通信

硬件 野火STM32开发板 操作系统 FreeRTOS 软件Keil5野火蓝牙模块 ESP8266模块 1. ESP8266 简介 ESP8266 是串口型 WIFI&#xff0c;速度比较低&#xff0c;不能用来传输图像或者视频这些大容量的数据&#xff0c;主要应用于数据量传输比较少的场合&#xff0c;比如温湿度…

《Clustering Propagation for Universal Medical Image Segmentation》CVPR2024

摘要 这篇论文介绍了S2VNet&#xff0c;这是一个用于医学图像分割的通用框架&#xff0c;它通过切片到体积的传播&#xff08;Slice-to-Volume propagation&#xff09;来统一自动&#xff08;AMIS&#xff09;和交互式&#xff08;IMIS&#xff09;医学图像分割任务。S2VNet利…

单体应用、SOA和微服务架构有什么区别?

大家好&#xff0c;我是锋哥。今天分享关于【单体应用、SOA和微服务架构有什么区别&#xff1f;】面试题。希望对大家有帮助&#xff1b; 单体应用、SOA和微服务架构有什么区别&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 单体应用&#xff08;Mono…

实习冲刺第四十天

54.螺旋矩阵 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5] 思路详解&#xff1a;本题我们可以设置…

第11篇 计算数据中最长的连续1的个数__ARM C语言<四>

Q&#xff1a;如何设计ARM C语言程序将结果&#xff08;最长的连续1的个数&#xff09;显示在7段数码管上&#xff1f; A&#xff1a;基本原理与ARM汇编语言程序类似&#xff0c;也是对HEX并行端口对应内存映射地址进行写操作。如要在HEX0上显示数字0&#xff0c;就点亮除数码…

软件无线电安全之GNU Radio基础(下)

往期回顾 软件无线电安全之GUN Radio基础(上) 背景 在上一小节中&#xff0c;我们简单介绍和使用了GNU Radio软件的基础功能和模块&#xff0c;同时通过GNU Radio Companion&#xff08;GRC&#xff09;创建了简单的流程图&#xff0c;展示了信号生成、处理和输出的流程。最后…

用点云信息来进行监督目标检测

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;传知代码 欢迎大家点赞收藏评论&#x1f60a; 目录 概述问题分析Making Lift-splat work well is hard深度不准确深度过拟合不准确的BEV语义 模型总体框架显性深度监督 深度细化模块演示效果核心…

Issue id: AppLinkUrlError 应用intent-filter 配置深链接 URL 问题分析 | AndroidManifest

AndroidManifest.xml 配置文件中&#xff0c;对 activity 组件进行声明的时候&#xff0c;独立应用在 IDE 显示 intent-filter 报错&#xff0c;但不影响实际编译&#xff0c;因为是系统应用&#xff0c;肯定会有此 URL 的存在。 AOSP 源码&#xff1a; <activity android:…

视频监控汇聚平台:Liveweb安防监控平台实现接入监控视频集中管理方案

随着各行业数字化转型的不断推进&#xff0c;视频监控技术在行业内的安防应用及管理支撑日益增多。然而&#xff0c;由于前期规划不清晰、管理不到位等问题&#xff0c;视频监管系统普遍存在以下问题&#xff1a; 1. 各部门单位在视频平台建设中以所属领域为单位&#xff0c;导…

Java JVM(内存结构,垃圾回收,类加载,内存模型)

一、JVM 主要功能 1. 什么是 jvm&#xff1f; JVM&#xff08;Java Virtual Machine)&#xff1a;负责运行 Java 程序的核心组件。它将 Java 字节码&#xff08;.class 文件&#xff09;解释或编译为机器代码&#xff0c;并提供内存管理、垃圾回收和线程管理等功能。 JRE (J…