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.xdnf.cn/news/34587.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

如何在谷歌浏览器中设置网络代理

在当今的网络环境中&#xff0c;使用代理服务器可以增强您的隐私和安全性。如果您希望在谷歌浏览器中设置网络代理&#xff0c;本文将为您提供详细的步骤指南。此外&#xff0c;我们还会简要介绍如何使用谷歌浏览器的任务管理器、查看Cookies以及更换侧边栏位置&#xff0c;以便…

【AI系统】MobileNet 系列

MobileNet 系列 在本文会介绍 MobileNet 系列&#xff0c;重点在于其模型结构的轻量化设计&#xff0c;主要介绍详细的轻量化设计原则&#xff0c;基于这原则&#xff0c;MobileNetV1 是如何设计成一个小型&#xff0c;低延迟&#xff0c;低功耗的参数化模型&#xff0c;可以满…

分层架构 IM 系统之 Router 假在线分析

通过对分层架构 IM 系统的分析&#xff0c;Router 的核心职责是作为中央存储记录在线客户端与 Entry 节点之间的映射关系&#xff0c;在本质上 Router 是一个内存数据库。 客户端已经离线&#xff0c;Entry 还未感知&#xff0c;或者 Entry 已经感知并且切断了连接&#xff0c;…

04 创建一个属于爬虫的主虚拟环境

文章目录 回顾conda常用指令创建一个爬虫虚拟主环境Win R 调出终端查看当前conda的虚拟环境创建 spider_base 的虚拟环境安装完成查看环境是否存在 为 pycharm 配置创建的爬虫主虚拟环境选一个盘符来存储之后学习所写的爬虫文件用 pycharm 打开创建的文件夹pycharm 配置解释器…

在Java的xml的sql语句里面的某一个参数是list集合的时候

经常在Java里面&#xff0c;遇到这样的问题&#xff0c;sql的一个查询语句&#xff0c;它的某一个参数是一个List集合&#xff0c;然而&#xff0c;在xml.mapper文件里面的时候&#xff0c;不知道如何去组成这个查询语句&#xff0c;不知道兄弟们是否经常忘记如何去写这个语句&…

pdf转word/markdown等格式——MinerU的部署:2024最新的智能数据提取工具

一、简介 MinerU是开源、高质量的数据提取工具&#xff0c;支持多源数据、深度挖掘、自定义规则、快速提取等。含数据采集、处理、存储模块及用户界面&#xff0c;适用于学术、商业、金融、法律等多领域&#xff0c;提高数据获取效率。一站式、开源、高质量的数据提取工具&…

一文讲清楚ROS2中多线程、并发、回调组的概念和基础使用

前言 在机器人开发中&#xff0c;多线程的使用司空见惯。ROS2借助executor类帮助开发者简化多线程的使用&#xff0c;但是还是得先把基本概念搞清楚&#xff0c;才能正确的使用。本文解释了ROS1和ROS2中的并发/多线程概念&#xff0c;并且给出了ROS2版本一些实际例子帮助理解。…

《向量数据库指南》——Mlivus Cloud:OPPO的向量数据库选型秘籍

Why Mlivus Cloud? —— 向量数据库选型的深度剖析与实战分享 在当今这个数据驱动的时代,向量数据库作为处理非结构化数据的重要工具,正逐渐受到业界的广泛关注。OPPO,作为全球知名的智能手机制造商,也在这场技术变革中积极探索和实践。他们在向量检索的道路上,从最初的…

MySQL:锁机制

锁是计算机协调多个进程或线程并发访问某一资源的机制&#xff08;避免争抢&#xff09;。 在数据库中&#xff0c;除传统的计算资源&#xff08;如 CPU、RAM、I/O 等&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效…

HTMLCSS :动态效果的玫瑰花

这段代码通过 HTML 和 CSS 的结合&#xff0c;创建了一个动态的花朵效果&#xff0c;展示了 CSS 动画和定位的强大功能。 演示效果 HTML&CSS <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equ…

深入浅出:SOME/IP-SD的工作原理与应用

目录 往期推荐 相关缩略语 SOME/IP 协议概述 协议介绍 SOME/IP TP 模块概述和 BSW 模块依赖性 原始 SOME/IP 消息的Header格式 SOME/IP-SD 模块概述 模块介绍 BSW modules依赖 客户端-服务器通信示例 Message 结构 用于SD服务的BSWM状态处理 往期推荐 ETAS工具…

【AI系统】EfficientFormer 系列

EfficientFormer 系列 本文主要介绍一种轻量化的 Transformer 结构&#xff0c;在获得高性能的同时&#xff0c;能够保持一定的推理速度。以延迟为目标进行优化设计。通过延迟分析重新探讨 ViT 及其变体的设计原则。 EfficientFormer V1 模型 EfficientFormer V1:基于 ViT 的…

vue3 vite ts day1

创建项目&#xff1a; npm init vitelatest 来创建项目 第二布&#xff1a; y 第三步&#xff1a;project name &#xff1a;项目名称 第四步&#xff1a;select a framework 选择框架 熟悉那种选择那种&#xff0c;当前选择vue 第五步&#xff1a;select a variant&…

dbus接口方法的variant类型传参详解

python实现c++中so库调用及dbus服务开发-CSDN博客 之前写的这篇博文介绍了如何创建一个dbus服务,但是注册的接口方法的入参还是比较简单的,实际上dbus的参数类型有很多种,调用方式也有多种,我们来逐一介绍下。 其实基础数据类型,如字符串、整型、浮点型、布尔型等大多数…

路由策略一

目录 匹配C类网络全部的子网 ip ip-prefix 1 permit 192.0.0.0 3 greater-equal 25 less-equal 32 ACL的组成&#xff1a; ACL编号&#xff1a;在网络设备上配置ACL时&#xff0c;每个ACL都需要分配一个编号&#xff0c;称为ACL编号&#xff0c;用来标识ACL。不同分类的AC…

摩尔线程 国产显卡 MUSA 并行编程 学习笔记-2024/12/03

Learning Roadmap&#xff1a; Section 1: Intro to Parallel Programming & MUSA Deep Learning Ecosystem&#xff08;摩尔线程 国产显卡 MUSA 并行编程 学习笔记-2024/11/30-CSDN博客&#xff09;UbuntuDriverToolkitcondapytorchtorch_musa环境安装(2024/11/24-Ubunt…

基于 MindQuantum 实现对 “天衍” 量子云平台真机的比特映射

MindQuantum 目前只支持量子模拟器&#xff0c;如果需要获得量子算法在真机上的实测数据&#xff0c;可以借助“天衍”量子云平台提供的真机。本文将介绍如何基于 MindQuantum 绘制“天衍”真机的拓扑图&#xff0c;并进而实现比特映射。 关于 MindQuantum 涉及比特映射的教程…

2025客服知识库工具推荐哪些?

在2025年&#xff0c;企业对于客服知识库工具的需求日益增长&#xff0c;这些工具不仅能够提升客户服务的效率和质量&#xff0c;还能增强客户满意度和忠诚度。以下是几款备受推崇的客服知识库工具。 1. HelpLook AI知识库 HelpLook AI知识库是一款企业级AI知识库系统&#x…

Docker运行hello-world镜像出现错误

错误类型&#xff1a; 解决方案&#xff1b; 配置加速地址&#xff1a;设置registry mirror sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors": ["https://do.nark.eu.org","https://dc.j8.work"…