【Python Cookbook】S02E04 文本模式的匹配和查找 match()、search()、findall() 以及 捕获组和 + 的含义

目录

  • 问题
  • 解决方案
  • 讨论

问题

本文讨论一些按照特定的文本模式进行的查找和匹配。

解决方案

如果想要匹配的只是简单文字,通常我们使用一些内置的基本字符串方法即可,如:str.find()str.startwith()str.endswith() 或类似的函数。

text = "hello world"match_str1 = text == 'hello world'
match_str2 = text.startswith("hello")
match_str3 = text.endswith("world")
match_str4 = text.find("w")
match_str5 = text.find("wo")
print(match_str1, match_str2, match_str3, match_str4, match_str5)

对于更为复杂的匹配则需要使用正则表达式以及 re 模块。本文中,将主要围绕 re 模块的两大函数 match() search() 以及 findall() 展开。

match()
请思考,为什么下列两个字符串中使用相同的正则化匹配结果不同?

import retext_1 = "11/10/2023"
text_2 = "I just found my heart beat quickly from 11/10/2023, but I don't think that is love."if re.match(r'\d+/\d+/\d+', text_1):print(True)
else:print(False)if re.match(r'\d+/\d+/\d+', text_2):print(True)
else:print(False)

真实原因在于 re.match() 函数只在字符串的开始处进行匹配,text_1 中日期出现了开头处,但是在 text_2 中,日期在字符串的中间。

如果我们希望匹配到字符串中任何位置的日期,则应该使用 re.search() 函数。

re.search()

import remessage = "I just found my heart beat quickly from 11/10/2023, but I don't think that is love."
match = re.search(r'\d+/\d+/\d+', message)
if match:print("The message contains the value of date. And, the date is", match.group())
else:print("The message does not contain the value of date.")

结果:

在这里插入图片描述

上述代码中,通过 match.group() 方法从正则化对象 match 提取出匹配到的结果。

但是如果我们一段描述中包含多个日期内容,那么 search() 函数能够找到全部的日期内容吗?如果找不到,有什么别的函数?

findall()

import rebut = "I just found my heart beat quickly from 11/10/2023, but I don't think that is love. And now, 06/06/2024, I think it is time to put all down."
match_1 = re.search(r'\d+/\d+/\d+', but)
print("match_1:", match_1.group())
match_2 = re.findall(r'\d+/\d+/\d+', but)
print("match_2:", match_2)

结果:

在这里插入图片描述

顾名思义,findall(),即 “找到所有”,其作用的确是在字符串中找到所有的满足正则化规则的值,并以列表形式返回。

print(type(match_1))
print(type(match_2))

结果:

<class 're.Match'>
<class 'list'>

明显,search() 函数的结果是正则化对象,而*findall()* 函数的结果是列表的形式。

讨论

更多的,如果我们打算对同一种模式做多次匹配,即,对很多字符串匹配同一个正则化规则,我们可以将正则表达式模式提取出来,预编译成一个模式对象。

import remessage_1 = "yesterday is 05/06/2024."
message_2 = "today is 06/06/2024."
message_3 = "tomorrow is 07/06/2024"datepat = re.compile(r'\d+/\d+/\d+')
print(datepat.search(message_1).group())
print(datepat.search(message_2).group())
print(datepat.search(message_3).group())

更多的,读者有没有思考过,group() 函数中可以有什么参数不?

当定义正则表达式时,我们常常会将部分模式用括号包起来的方式引入捕获组。如

import remessage = "yesterday is 05/06/2024."
datepat = re.compile(r'(\d+)/(\d+)/(\d+)')print(datepat.search(message).group())
print(datepat.search(message).group(2))

结果:

05/06/2024
2024

在正则表达式模式中,我们用 “()” 包裹了三个捕获组,对应到本样例中,即 group(1) -> ddgroup(2) -> mmgroup(3) -> yyyy

最后,\d+ 中,+ 是什么含义??

import repattern_1 = re.compile(r'\d')
pattern_2 = re.compile(r'\d+')message = "我今年25岁了"
print(re.search(pattern_1, message).group())
print(re.search(pattern_2, message).group())

对比 pattern_1pattern_2 的结果,可知在正则化表达式模式中,+ 不代表数字加,不代表字符串的连结,而是代表一种“更多”的含义,在本案例中,即可以匹配 更多的 \d 整数,所以能匹配到 25,而不带 +pattern_1 只能匹配到一个数字。

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

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

相关文章

Day49 动态规划part08

LC139单词拆分(未掌握) 未掌握分析&#xff1a;将字符串s中的各个字符看成是背包&#xff0c;思考成了多重背包问题单词就是物品&#xff0c;字符串s就是背包&#xff0c;单词能否组成字符串s&#xff0c;就是问物品能不能把背包装满。拆分时可以重复使用字典中的单词&#xf…

转速传感器介绍

一、概述 RPM&#xff08;Revolutions Per Minute&#xff09;转速传感器是一种用于测量旋转机械设备转速的传感器。它可以检测旋转部件上的特定位置标记&#xff08;如齿轮、凸起或磁铁&#xff09;&#xff0c;并根据这些标记的通过频率来计算转速。发电额定频率是50hz和60z…

ubuntu18.04环境下,arduino ide在打开串口监视器时报错

ubuntu18.04环境下&#xff0c;arduino ide在打开串口监视器时报错 Exception in thread “AWT-EventQueue-0” java.lang.UnsatisfiedLinkError: /home/lzx/.jssc/linux/libjSSC-2.8_x86_64.so: /home/lzx/.jssc/linux/libjSSC-2.8_x86_64.so: file too short 这个错误表明 li…

力扣1574.删除最短的子数组使剩余数组有序

力扣1574.删除最短的子数组使剩余数组有序 剩下有序 –> 前面一段 后面一段 有序 前面有序 后面有序 前面最后一项 < 后面第一项先反向遍历找到right的最小值然后正向遍历找left的最大值当nums[left] > nums[right]时 right class Solution {public:int findLen…

java线程变量共享

在Java中&#xff0c;线程变量共享可以通过几种方式实现&#xff1a; 1.实例变量&#xff1a;如果一个实例变量被多个线程共享&#xff0c;你需要确保适当的同步&#xff0c;以避免竞态条件。你可以使用synchronized关键字或者Lock接口来保护共享变量。 2.静态变量&#xff1a;…

openh264 降噪功能源码分析

文件位置 ● openh264/codec/processing/denoise/denoise.cpp ● openh264/codec/processing/denoise/denoise_filter.cpp 代码流程 说明&#xff1a;从代码流程可以看到&#xff0c;实现降噪的核心功能主要就是BilateralDenoiseLuma、WaverageDenoiseChroma两个函数。 原理…

SOA主要协议和规范

Web服务作为实现SOA中服务的最主要手段。首先来了解Web Service相关的标准。它们大多以“WS-”作为名字的前缀&#xff0c;所以统称“WS-*”。Web服务最基本的协议包括UDDI、WSDL和SOAP&#xff0c;通过它们&#xff0c;可以提供直接而又简单的Web Service支持&#xff0c;如图…

代码随想录算法训练营第十五天| 110.平衡二叉树、 257. 二叉树的所有路径、404.左叶子之和

110.平衡二叉树 题目链接&#xff1a;110.平衡二叉树 文档讲讲&#xff1a;代码随想录 状态&#xff1a;还可以 思路&#xff1a;计算左右子树的深度差&#xff0c;递归判断左右子树是否符合平衡条件 题解&#xff1a; public boolean isBalanced(TreeNode root) {if (root n…

覆盖路径规划经典算法 The Boustrophedon Cellular Decomposition 详解

2000年一篇论文 Coverage of Known Spaces: The Boustrophedon Cellular Decomposition 横空出世&#xff0c;解决了很多计算机和机器人领域的覆盖路径问题&#xff0c;今天我来详细解读这个算法。 The Boustrophedon Cellular Decomposition 算法详解 这篇论文标题为"C…

nginx配置正向代理忽略证书!!!!!

要绕过证书验证并忽略SSL证书检查&#xff0c;可以使用curl的-k或--insecure选项。这允许curl在连接到HTTPS站点时忽略证书错误。你可以这样做&#xff1a; curl -k https://220.181.49.193:10010/sms/11011200002020000001/flv/hls/11010000021321001788_1101000002132100178…

数字模拟EDA研发环境搭建

中小企业数字模拟EDA研发环境部署、集群搭建、网络配置、硬件咨询、数据备份、技术指导、环境生命周期维护等&#xff0c;Cadence、Synopsys、Mentor、Keysight、ANSYS&#xff0c;MATLAB、Xilinx等厂商软件工具安装调试。 EDA研发环境搭建经验交流&#xff0c;请加V

【Neo4j】Windows11使用Neo4j导入CSV数据可视化知识图谱

Windows11使用Neo4j导入CSV数据可视化知识图谱 序1. 安装JDK21&#xff08;1&#xff09;下载&#xff08;2&#xff09;安装&#xff08;3&#xff09;环境配置 2. 安装Neo4j&#xff08;1&#xff09;下载&#xff08;2&#xff09;解压安装&#xff08;3&#xff09;环境配置…

初识C++ · 模板进阶

目录 前言&#xff1a; 1 非类型模板参数 2 按需实例化 3 模板特化 4 模板的分离编译 前言&#xff1a; 前面模板我们会了简单的使用&#xff0c;这里带来模板的进阶&#xff0c;当然&#xff0c;也就那么几个知识点&#xff0c;并不太难。 1 非类型模板参数 先来看这样…

嵌入式移植jpeglib--Linux交叉编译ARM平台

一 、交叉编译jpeg库 1.下载源码tar.gz 2. 源码目录下执行 jpeglib配置文件 ./configure CCarm-none-linux-gnueabihf-gcc LDarm-none-linux-gnueabihf-ld --prefix/work/jpeg_arm_lib --exec-prefix/work/jpeg_arm_lib --enable-shared --enable-static --hostarm-none-linu…

经典文献阅读之--MGS-SLAM(单目稀疏跟踪和高斯映射与深度平滑正则化)

Tip: 如果你在进行深度学习、自动驾驶、模型推理、微调或AI绘画出图等任务&#xff0c;并且需要GPU资源&#xff0c;可以考虑使用UCloud云计算旗下的Compshare的GPU算力云平台。他们提供高性价比的4090 GPU&#xff0c;按时收费每卡2.6元&#xff0c;月卡只需要1.7元每小时&…

CiteScore 2023发布,AI Open斩获45分,位列全球计算机领域前1%

与影响因子&#xff08;IF&#xff09;一样&#xff0c;引用分数&#xff08;CiteScore&#xff09;同样是衡量学术期刊影响力的重要指标之一&#xff0c;且大有赶超前者的势头。 6 月 6 日&#xff0c;CiteScore 2023 正式发布&#xff0c;人工智能领域可自由访问的期刊平台 …

Java 8 中的 Stream API,用于处理集合数据

Java 8 引入了 Stream API&#xff0c;使得处理集合数据变得更加简洁和高效。Stream API 允许开发者以声明式编程风格操作数据集合&#xff0c;而不是使用传统的迭代和条件语句。 一、基本概念 1.1 什么是 Stream Stream 是 Java 8 中的一个新抽象&#xff0c;它允许对集合数…

CSRF 令牌的生成过程和检查过程

在 Django 中,CSRF 令牌的生成和检查过程是通过 Django 的 CSRF 中间件 (CsrfViewMiddleware) 和模板标签 ({% csrf_token %}) 自动处理的。以下是详细的生成和检查过程: CSRF 令牌的生成过程 用户访问页面: 当用户第一次访问页面时,Django 会为用户创建一个会话。如果用户…

人工智能、深度学习和机器学习的前世今生

人工智能、深度学习和机器学习的前世今生 引言 在当今科技飞速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&#xff09;和深度学习&#xff08;DL&#xff09;已经成为引领第四次工业革命的重要力量。这些技术不仅在学术界和工业界掀…

C++ 数据共享与保护学习记录【代码】

一.项目一 1.头文件.h //A.h #pragma once //防止头文件被重复包含&#xff08;重复包含会被重复编译&#xff0c;也就是该类会被重复定义&#xff09; #ifndef HEAD_H //等价于&#xff08; #if !defined(HEAD_H) ) //defined是一个预处理操作符&#xff0c;相当于一个表达式…