01 Python进阶:正则表达式

news2024/11/25 0:40:06

re.match函数

使用 Python 中的 re 模块时,可以通过 re.match() 函数来尝试从字符串的开头匹配一个模式。以下是一个简单的详解和举例:

import re

# 定义一个正则表达式模式
pattern = r'^[a-z]+'  # 匹配开头的小写字母序列

# 要匹配的字符串
text = "hello world"

# 使用 re.match() 尝试匹配模式
match_obj = re.match(pattern, text)

if match_obj:
    print("匹配成功:", match_obj.group())
else:
    print("无匹配结果")

在这个示例中,我们使用了 re.match() 函数来尝试从字符串的开头匹配一个小写字母序列。让我们具体解释一下:

  • r'^[a-z]+':这是一个正则表达式模式,包含了以下几个部分:

    • ^ 表示匹配字符串的开头。
    • [a-z] 表示匹配任意一个小写字母。
    • + 表示匹配前面的模式一次或多次。
  • "hello world":这是我们要进行匹配的字符串。

  • re.match(pattern, text):使用 re.match() 函数尝试从字符串开头匹配指定的模式。

  • match_obj:re.match() 函数返回一个 Match 对象,如果匹配成功则包含匹配的结果,否则为 None。

  • match_obj.group():如果匹配成功,可以通过 match_obj.group() 方法获取匹配的内容。

在这个示例中,由于 “hello” 符合模式 r'^[a-z]+',因此匹配成功,输出 “匹配成功: hello”。

re.search方法

可以通过 re.search() 函数来搜索整个字符串,尝试找到与指定模式匹配的子串。以下是一个详细解释和示例:

import re

# 定义一个正则表达式模式
pattern = r'world'  # 要匹配的模式是 "world"

# 要搜索的字符串
text = "hello world"

# 使用 re.search() 方法在整个字符串中搜索模式
search_obj = re.search(pattern, text)

if search_obj:
    print("找到匹配:", search_obj.group())
else:
    print("未找到匹配")

在这个示例中,我们使用了 re.search() 函数来搜索整个字符串,尝试找到子串 “world”。以下是每个部分的详细解释:

  • r'world':这是一个简单的正则表达式模式,它表示要匹配的字符串是 “world”。

  • "hello world":这是我们要进行搜索的字符串。

  • re.search(pattern, text):使用 re.search() 函数在整个字符串中搜索指定的模式。

  • search_obj:re.search() 函数返回一个 Match 对象,如果找到了匹配的子串,Match 对象就会包含匹配的结果,否则为 None。

  • search_obj.group():如果找到了匹配的子串,可以通过调用 match_obj.group() 方法来获取匹配的内容。

在这个示例中,由于字符串 “world” 存在于 “hello world” 中,因此 re.search() 函数找到了匹配,输出 “找到匹配: world”。

re.search() 是一个非常有用的函数,可以帮助您在字符串中查找特定的模式。希望这个示例能够帮助您理解 re.search() 函数的使用方法。

re.match 与 re.search的区别

re.match() 和 re.search() 是 Python 中 re 模块中用于正则表达式匹配的两个函数,它们之间有以下区别:

  1. re.match():

    • re.match() 函数尝试从字符串的开头开始匹配模式。
    • 如果字符串开头不符合模式,则匹配失败,返回 None。
    • 如果字符串开始部分与模式匹配,返回一个 Match 对象,可以通过 group() 方法获取匹配的内容。
  2. re.search():

    • re.search() 函数在整个字符串中搜索并找到第一个符合模式的子串。
    • 不要求字符串从开头开始匹配,只要找到一个符合模式的子串就返回。
    • 返回第一个匹配到的结果,也是一个 Match 对象,可以通过 group() 方法获取匹配的内容。

举例来说,假设有字符串 “hello world”,并使用以下两个正则表达式模式进行匹配:

  • 模式为 r'world'

    • re.match() 将会匹配失败,因为 “hello” 不符合该模式,返回 None。
    • re.search() 将会匹配成功,在 “world” 中找到了符合的子串,返回 “world”。
  • 模式为 r'hello'

    • re.match() 将会匹配成功,因为 “hello” 符合该模式,返回 “hello”。
    • re.search() 将会匹配成功,在 “hello world” 中找到了符合的子串,返回 “hello”。

re.match() 适用于需要从字符串开头处进行匹配的场景,而 re.search() 则适用于需要在整个字符串中查找符合模式的子串的场景。根据具体的需求选择使用不同的函数能够更有效地实现匹配目的。

检索和替换

在Python中,您可以使用re模块来进行文本的检索和替换。下面是一个简单的例子来说明如何使用re模块进行检索和替换:

import re

# 要操作的字符串
text = "The cat and the hat sat on the mat."

# 定义要搜索的模式
pattern = r'cat'

# 使用re.sub()进行替换
new_text = re.sub(pattern, 'dog', text)

print(new_text)

在上面的示例中,我们使用了re.sub()函数来将文本中所有匹配模式r’cat’的部分替换为’dog’。执行上述代码后,输出结果为:“The dog and the hat sat on the mat.”。

另外,如果想要查找所有匹配的子串,并对其进行特定处理,也可以使用re.findall()和re.finditer()函数来实现。这两个函数可以用于找到所有匹配的子串,并返回它们的位置或者进行进一步的处理。

repl 参数是一个函数

是的,re 模块中的 re.sub() 函数允许使用一个函数作为 repl 参数,以便对每个匹配的子串进行更复杂的替换操作。下面是一个示例,演示了如何使用函数作为 repl 参数:

import re

# 要操作的字符串
text = "The cat and the hat sat on the mat."

# 定义替换函数
def repl_function(match_obj):
    word = match_obj.group()
    if word == 'cat':
        return 'dog'
    elif word == 'hat':
        return 'rug'
    else:
        return '***'

# 使用re.sub()并将函数作为repl参数
new_text = re.sub(r'\b(cat|hat)\b', repl_function, text)

print(new_text)

在这个示例中,我们定义了一个名为 repl_function 的函数,该函数接收一个 Match 对象作为输入,并根据匹配到的子串来决定如何进行替换。然后,我们使用 re.sub() 函数,将这个函数作为 repl 参数传递给它。执行上述代码后,输出结果为:“The dog and the rug sat on the mat.”。

函数作为 repl 参数的用法,可以让你对每个匹配到的子串进行更加灵活和复杂的处理,从而进行更加精细的替换操作。

compile 函数

在 Python 中,re 模块提供了 compile() 函数,用于将正则表达式编译为一个对象,以便在之后的匹配中复用。这种预编译的方式可以提高匹配效率,特别是在需要多次使用同一模式进行匹配时。下面是一个简单的示例来说明 compile() 函数的使用:

import re

# 将正则表达式编译为对象
pattern = re.compile(r'hello')

# 要匹配的字符串
text = "hello world"

# 使用编译后的对象进行匹配
match_obj = pattern.search(text)

if match_obj:
    print("找到匹配:", match_obj.group())
else:
    print("未找到匹配")

在上述示例中,我们首先使用 re.compile() 函数将正则表达式模式 r’hello’ 编译为一个模式对象 pattern,然后在之后的代码中可以重复使用这个 pattern 对象进行匹配操作。

使用 compile() 函数的优点包括提高匹配效率和可以提前检查正则表达式的有效性(如果有语法错误,会在编译阶段就抛出异常)。

re.compile() 函数允许您事先编译好正则表达式模式,并得到一个可重复使用的模式对象,为之后的匹配操作提供了便利和性能上的提升。

findall

在 Python 的 re 模块中,re.findall() 函数用于在给定的字符串中查找所有匹配指定模式的子串,并以列表的形式返回这些子串。下面是一个简单的示例来说明 re.findall() 函数的使用:

import re

# 要匹配的字符串
text = "The cat and the hat sat on the mat."

# 使用 re.findall() 查找所有匹配的子串
matches = re.findall(r'\b\w{3}\b', text)

print(matches)

使用了 re.findall() 函数来搜索字符串中所有匹配特定模式的子串。具体来说,我们使用的模式是 \b\w{3}\b,表示匹配长度为 3 的单词。

执行这段代码后,将输出结果作为一个列表:['The', 'cat', 'the', 'hat', 'sat', 'the', 'mat'],其中包含所有匹配到的长度为3的单词。

re.findall() 函数非常适合在不需要对每个匹配结果做更复杂处理的情况下,快速地获取所有匹配到的子串。当需要获取文本中所有符合特定模式的部分时,这个函数非常实用。

re.finditer

re.finditer() 函数与 re.findall() 类似,但它返回一个迭代器(iterator),该迭代器生成匹配的模式在字符串中的每一次出现。下面是一个简单的示例来说明 re.finditer() 函数的使用:

import re

# 要匹配的字符串
text = "The cat and the hat sat on the mat."

# 使用 re.finditer() 查找所有匹配的子串
matches = re.finditer(r'\b\w{3}\b', text)

for match in matches:
    print(match.group(), match.start(), match.end())

在这个示例中,我们使用了 re.finditer() 函数来搜索字符串中所有匹配特定模式的子串。具体来说,我们使用的模式是 \b\w{3}\b,表示匹配长度为 3 的单词。

使用 re.finditer() 返回的迭代器,我们可以迭代处理每次匹配到的结果,从中获取匹配子串的内容以及其在原始文本中的起始和结束位置。执行上述代码后, 将输出每个匹配子串的内容以及起始和结束索引位置。

因此,re.finditer() 是一个非常有用的函数,特别适用于需要对每个匹配结果做更复杂处理的情况,或者在需要获取匹配子串的位置信息时。

re.split

re.split() 函数用于根据指定的模式对字符串进行分割,并返回分割后的子串组成的列表。下面是一个简单的示例来说明 re.split() 函数的使用方式:

import re

# 要分割的字符串
text = "apple, banana, cherry, date"

# 使用 re.split() 进行分割
result = re.split(r',\s*', text)

print(result)

在这个示例中,我们使用了 re.split() 函数来根据逗号加空格的模式 ,\\s* 对字符串进行分割,其含义是以逗号加零或多个空格为分隔符。执行上述代码后,将输出结果作为一个列表:['apple', 'banana', 'cherry', 'date'],即根据指定的模式成功地将原始字符串分割成了多个子串。

re.split() 是在字符串操作中非常有用的函数,特别适用于需要根据复杂的模式对字符串进行分割的情况,如按照标点符号、空格或其他自定义的分割符号进行分割。

正则表达式对象

正则表达式对象
re.RegexObject
re.compile() 返回 RegexObject 对象。

re.MatchObject
group() 返回被 RE 匹配的字符串。

  • start() 返回匹配开始的位置
  • end() 返回匹配结束的位置
  • span() 返回一个元组包含匹配 (开始,结束) 的位置

在 Python 的 re 模块中,使用re.compile()函数可以将正则表达式模式编译为一个正则表达式对象。正则表达式对象具有与模式相关联的各种方法,可用于在文本中进行搜索、匹配和替换操作。以下是一些常用的正则表达式对象的方法:

  1. search(string[, pos[, endpos]]): 在字符串中搜索模式的第一个匹配项,返回一个匹配对象。
  2. match(string[, pos[, endpos]]): 在字符串开头匹配模式,如果匹配成功则返回一个匹配对象。
  3. findall(string[, pos[, endpos]]): 找到所有与模式匹配的子串,并以列表的形式返回这些子串。
  4. finditer(string[, pos[, endpos]]): 返回一个迭代器,用于生成字符串中与模式匹配的每一个匹配对象。
  5. split(string[, maxsplit]): 根据模式对字符串进行分割,返回分割后的子串组成的列表。
  6. sub(repl, string, count=0): 使用指定的替换字符串替换匹配到的模式,返回替换后的字符串。

正则表达式对象的创建通过re.compile()函数,其基本语法如下:

import re
pattern = re.compile(r'正则表达式模式')

接下来,您可以使用pattern对象调用上述列出的方法来进行搜索、匹配或替换操作。例如:

# 使用 compile() 函数将正则表达式模式编译为对象
pattern = re.compile(r'\b\w{4}\b')

# 使用 findall() 方法找到所有匹配的子串
matches = pattern.findall("The cat and the hat sat on the mat.")
print(matches)

这将会输出:['cat', 'hat', 'sat'],即从字符串中找到了所有长度为 4 的单词。

正则表达式修饰符 - 可选标志

正则表达式可以包含一些可选标志修饰符来控制匹配的模式。

以下标志可以单独使用,也可以通过按位或(|)组合使用。例如,re.IGNORECASE | re.MULTILINE 表示同时启用忽略大小写和多行模式。
在这里插入图片描述
在这里插入图片描述

正则表达式模式

正则表达式模式是由普通字符(例如字符 a 到 z)和特殊字符(称为元字符)组合而成的字符串,用于描述在文本中搜索、匹配或替换特定模式的规则。下面列举了一些常用的正则表达式元字符及其含义:

  1. .:匹配任意单个字符,除了换行符。
  2. ^:匹配字符串的开头。
  3. $:匹配字符串的结尾。
  4. *:匹配前面的元素零次或多次。
  5. +:匹配前面的元素一次或多次。
  6. ?:匹配前面的元素零次或一次。
  7. \d:匹配任意数字,相当于 [0-9]。
  8. \w:匹配字母、数字、下划线,相当于 [a-zA-Z0-9_]。
  9. [...]:匹配方括号中的任意一个字符。
  10. (x|y):匹配 x 或 y。
  11. \s:匹配任意空白字符,包括空格、制表符、换行符等。

除了上述元字符外,正则表达式还支持通过括号来表示分组,使用 {} 来指定重复次数,使用 \ 来转义特殊字符等。

例如,正则表达式模式 \b\w{3}\b 可以用于匹配长度为 3 的单词,其中:

  • \b 表示单词的边界。
  • \w 匹配任意字母、数字或下划线。
  • {3} 表示重复前面的元素三次。
  • 因此,整个模式就是匹配长度为 3 的单词。

正则表达式模式在对文本进行搜索、匹配或替换时非常强大,可以满足各种复杂的匹配需求。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

正则表达式实例

在这里插入图片描述
在这里插入图片描述

关注我,不迷路,共学习,同进步

关注我,不迷路,共学习,同进步

在这里插入图片描述

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

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

相关文章

采用大语言模型进行查询重写——Query Rewriting via Large Language Models

文章:Query Rewriting via Large Language Models,https://arxiv.org/abs/2403.09060 摘要 查询重写是在将查询传递给查询优化器之前处理编写不良的查询的最有效技术之一。 手动重写不可扩展,因为它容易出错并且需要深厚的专业知识。 类似地…

异常-模块-包-Python

师从黑马程序员 异常的概念 异常演示 捕获异常的方法 try:fopen("D:/abc.txt","r",encoding"UTF-8") except:print("出现异常了,因为文件不存在,我将open的模式,改为w模式去打开")fopen("D:/a…

继阿里EMO后,腾讯也提出了AniPortrait:用于生成由音频和参考肖像图像驱动的高质量动画

腾讯提出了一种新颖的框架-AniPortrait,用于生成由音频和参考肖像图像驱动的高质量动画。通俗讲,就是给张照片生成说话的视频。类似阿里的EMO,大家先可以简单看下效果。 相关链接 论文:arxiv.org/abs/2403.17694 代码&#xff1a…

【技术访谈】与Babbage项目团队畅谈BSV区块链的新代码库

​​发表时间:2024年3月12日 BSV区块链协会近期宣布上线了JavaScript和TypeScript SDK,后者旨在为开发者提供先进的统一核心代码库,以便利开发者在BSV区块链上开发具备可扩展性的应用程序。 新上线的SDK替代了此前被广泛使用的、但已长期不再…

家用洗地机如何选?四款2024高性能洗地机力荐

家庭清洁是每个家庭都需要面对的日常任务,而一款高效、实用的洗地机能够极大地减轻我们的清洁负担。然而,在众多洗地机品牌和型号中选择一款适合自己的产品并不容易。本文将为您提供一份全面的洗地机选购指南,帮助您了解各种洗地机的特点和功…

el-form表单去除部分校验结果

需求说明 如图: 当点击右边的叉时, 需要删除这个输入框,删除这个输入框只需要一个变量就可以解决。 但使用v-show的方式去除这个输入框的时候,但下面的校验信息却没有消失 解决方法 找了半天,表单局部重置的方法&a…

收下这份地表最强参会指南,4月16日,玩转百度Create大会不迷路

欢迎来到英杰社区: https://bbs.csdn.net/topics/617804998 欢迎来到阿Q社区: https://bbs.csdn.net/topics/617897397 📕作者简介:热爱跑步的恒川,致力于C/C、Java、Python等多编程语言,热爱跑步&#xff…

windows qt打包保姆级教学

windows qt打包保姆级教学 简述打包打包进阶 简述 在windows下开发的qt程序,想在其他windows计算机上运行,而那个计算机没有qt环境,执行时候会报错各种dll找不到,那么就需要将自己开发的qt程序和用到的库打包。 打包 这里先编译…

Transformer的代码实现 day03(Positional Encoding)

Positional Encoding的理论部分 注意力机制是不含有位置信息,这也就表明:“我爱你”,“你爱我”这两者没有区别,而在现实世界中,这两者有区别。所以位置编码是在进行注意力计算之前,给输入加上一个位置信息…

真·面试题总结——JVM虚拟机

JVM虚拟机 JVM虚拟机规范与实现 JVM虚拟机规范 JVM虚拟机实现 JVM的常见实现 JVM虚拟机物理架构 JVM虚拟机的运转流程 JVM类加载过程 JVM类加载器及类加载器类型 JVM类加载器双亲委派机制 JVM运行时数据区的内存模型 JVM运行时数据区的内存模型:程序计数器…

使用OpenCV4.9的随机生成器和文本

返回:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV 4.9基本绘图 下一篇:OpenCV系列文章目录(持续更新中......) 目标 在本教程中,您将学习如何: 使用随机数生…

Java中的可变字符串

Java中的可变字符串 一、什么是可变字符串二、可变字符串的使用场景以及使用步骤1.新建一个可变字符串2.可变字符串的一系列方法 一、什么是可变字符串 可变字符串是Java.lang包下的 在我们学习到JDBC的时候需要将原有的sql语句根据不同的差异添加一段新的关键字或者单词&…

C语言_第一轮笔记_指针

8.1 密码开锁 地址和指针 一般以变量所在的内存单元的第一个字节的地址作为他的地址NULL的值为0,代表空指针 指针变量的定义 类型名 *指针变量名类型名指定指针变量所指向变量的类型指针声明符*在定义指针变量时被使用,说明被定义的那个变量是指针指针变…

护眼台灯十大排名品牌有哪些?2024护眼台灯十大排名品牌推荐

在当今的教育环境中,学生们面临着相当沉重的学业压力。放学后,许多孩子便投入到无休止的作业之中,常常夜深人静时还未完成。作为家长,孩子的视力健康自然成为了我们心中的一块大石。夜间学习时,灯光的质量至关重要。标…

批量转换图片神器,支持tiff图片转换成png格式,图片高效转换

在数字图像处理领域,格式转换一直是关键且必要的环节。尤其对于设计师、摄影师、网站开发者等专业人士来说,能够快速、高效地将图片从一种格式转换为另一种格式,是提升工作效率和保障项目质量的关键。今天,我们荣幸地向您推荐一款…

低压配电室数字孪生实现区域内的无人值守

众所周知,电力设备的精益管控、精益检修与精益维护对于电网智慧化转型的重要性。因此数字孪生公司深圳华锐视点利用精湛的数字孪生、虚拟仿真、3D建模和图形图像技术,集成数据采集、监控预警、计划维护、数据分析、决策支持等核心模块,为电力…

从零开始构建gRPC的Go服务

介绍 Protocol Buffers and gRPC是用于定义通过网络有效通信的微服务的流行技术。许多公司在Go中构建gRPC微服务,发布了他们开发的框架,本文将从gRPC入门开始,一步一步构建一个gRPC服务。 背景 之前在B站看过一个gRPC教学视频,…

Linux进程控制(改)

Linux进程控制 进程 内核数据结构(struct task_struct,struct mm_struct,页表) 代码和数据 在Linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程 1.进程创建 ./程序fork&am…

GPS坐标转换为百度地图坐标并显示到百度地图上

百度地图有个坐标识取系统:https://api.map.baidu.com/lbsapi/getpoint/index.html,打开链接如下: 如上图,可以搜索某一个位置,然后会出现该位置的许多选择,选择一个就会显示出对应的百度地图的坐标&#x…

抖音小店正确的起店方法是什么?别再闭门造车了,快来学习!

大家好,我是电商糖果 随着抖音卖货的火爆的,开抖音小店的商家也越来越多。 很多没有电商经验的朋友就发现,想要起店非常难。 有的好一两个月了,都不出单。 糖果做抖音小店有四年时间了,也经营了多家小店。 这里就…