【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 re

text_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 re

message = "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 re

but = "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 re

message_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 re

message = "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 re

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

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

相关文章

qmt量化交易策略小白学习笔记第17期【qmt编程之获取对应周期的北向南向数据--方式1:内置python】

qmt编程之获取对应周期的北向南向数据 qmt更加详细的教程方法&#xff0c;会持续慢慢梳理。 也可找寻博主的历史文章&#xff0c;搜索关键词查看解决方案 &#xff01; 感谢关注&#xff0c;咨询免费开通量化回测与获取实盘权限&#xff0c;欢迎和博主联系&#xff01; 获取…

Qwen2本地部署的实战教程

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

重塑状态管理的艺术:Vue3中Pinia的魔法之旅内包含简易购物车案例

前言 在Vue.js的世界里&#xff0c;每一次更新都是一次进化&#xff0c;Vue3携带着更强大的性能与灵活性翩然而至。而在这场技术盛宴中&#xff0c;Pinia以一种优雅而革命性的方式&#xff0c;重新定义了状态管理的体验。如果说Vuex是Vue2时代的王者&#xff0c;那么Pinia无疑…

024、工具_慢查

1)发送命令 2)命令排队 3)命令执行 4)返回结果 需要注意,慢查询只统计步骤3)的时间,所以没有慢查询并不代表客 户端没有超时问题。 参数配置 slowlog-log-slower-than 单位是微秒(1秒=1000毫秒=1000000微秒),默认值是10000 lowlog-log-slower-than=0会记录所有的命…

Polar Web【简单】upload1

Polar Web【简单】upload1 Contents Polar Web【简单】upload1思路EXP运行&总结 思路 本题思路同之前两篇文中的文件上传题目性质相同&#xff0c;这里再次记录&#xff0c;旨在改良之前的脚本编写方式 —— 脚本运行后变为可交互的命令行形式。 打开环境&#xff0c;见要求…

算法课程笔记——可撤销并查集

算法课程笔记——可撤销并查集 Gv

网络协议三

数据中心 一、DNS 现在网站的数目非常多&#xff0c;常用的网站就有二三十个&#xff0c;如果全部用 IP 地址进行访问&#xff0c;恐怕很难记住 根 DNS 服务器 &#xff1a;返回顶级域 DNS 服务器的 IP 地址 顶级域 DNS 服务器&#xff1a;返回权威 DNS 服务器的 IP 地址 …

k8s:实现一个pod两个容器

# 制作两个容器的镜像 通过以下Dockerfile创建一个镜像 cd /chz/install/docker vim Dockerfile <<<< 内容如下&#xff1a; FROM centosRUN sed -i -e "s|mirrorlist|#mirrorlist|g" /etc/yum.repos.d/CentOS-* RUN sed -i -e "s|#baseurlhttp:/…

vue2的form利用插槽修改错误提示UI

1. 需求 很多时候我们使用el-form想修改下错误提示的UI&#xff0c;比如table中使用form校验这类场景下错误提示的UI调整就非常重要。 2. 了解文档 Form-Item Scoped Slot name说明error自定义表单校验信息的显示方式&#xff0c;参数为 { error } 3.实际使用 html里使用…

全年申报!2024年陕西省双软企业认定条件标准、申报好处费用

1.双软企业是什么? 答:双软认证并不是一个资质,而是"软件产品登记"和"软件企业认定"两个不同资质的统称.叫做"双软企业" 2.双软企业的优惠政策是什么? 答:(1)软件产品登记的优惠政策:软件产品增值税,从13%减按3%征收,实行即征即退; (2)软件…

个人vsCode配置文件<setting.js>

个人vsCode配置文件setting.js 快速打开1、使用快捷键 CtrlShiftP &#xff0c;然后搜索setting2、手动 自用配置 快速打开 1、使用快捷键 CtrlShiftP &#xff0c;然后搜索setting 2、手动 自用配置 {"terminal.integrated.profiles.windows": {"PowerShell&…

用自然语言连接信息孤岛

​​​​​​​ 信息孤岛互联互通的困难 尽管已经进入了互联网时代&#xff0c;信息系统中的信息孤岛现象仍然十分地严重&#xff0c;不同部门&#xff0c;不同机器之间难以实现互联互通。 不同信息系统的相互通信依赖通信协议和数据模型的定义&#xff0c;前者决定了通信的过…

[网络基础]——计算机网络(OSI)参考模型 详解

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f310;网络通信基础TCP/IP专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月2日21点59分 &#x1f004;️文章质量&#xff1a;93分 目录 &#x1f39f;️OSI基本概念 &#x1f384;分层架构…

Edge 工作区是什么?它都有哪些作用?

什么是工作区 Edge 工作区是什么&#xff1f;它是微软 Edge 浏览器中的一个功能&#xff0c;在帮助用户更好地组织和管理他们的浏览会话。通过工作区&#xff0c;用户可以创建多个独立的浏览环境&#xff0c;每个工作区内包含一组相关的标签页和浏览器设置。这使得用户能够根据…

开放式耳机哪个牌子好?5款开放式耳机排名大公开!速速收藏!

想要购买开放式耳机&#xff0c;但面对众多品牌和型号&#xff0c;你是否感到无从下手&#xff1f;别担心&#xff0c;作为耳机发烧友和测评专家&#xff0c;我为大家带来了几款热门开放式耳机的横向对比。从音质、设计、功能等方面进行详细对比&#xff0c;让你一目了然地了解…

解决Windows Hosts 文件因为权限无法修改的问题

如何修改 Windows Hosts 文件并添加域名映射 在日常工作中&#xff0c;可能需要修改 Windows 的 hosts 文件&#xff0c;以将特定的域名映射到指定的 IP 地址。本文介绍三种方法来完成这一任务&#xff1a;直接手动编辑 hosts 文件&#xff0c;使用批处理文件自动完成任务&…

Unity基础实践小项目

项目流程&#xff1a; 需求分析 开始界面 选择角色面板 排行榜面板 设置面板 游戏面板 确定退出面板 死亡面板 UML类图 准备工作 1.导入资源 2.创建需要的文件夹 3.创建好面板基类 开始场景 开始界面 1.拼面板 2.写脚本 注意事项&#xff1a;注意先设置NGUI的分辨率大小&…

MySQL数据库数据恢复方案应对没有where误操作导致的大量数据更新或删除

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

医疗保健的未来——Kompas.ai如何助力精准医疗

引言 在现代医学中&#xff0c;精准医疗逐渐成为提高诊疗效果的重要手段。随着科技的进步&#xff0c;人工智能&#xff08;AI&#xff09;在医疗领域的应用越来越广泛。本文将探讨精准医疗的发展趋势&#xff0c;并介绍Kompas.ai如何通过AI技术助力精准医疗的发展。 精准医疗…

@Validated 前端表单数据校验

1. 整合 1.1 依赖引入 <dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId></dependency>1.2 控制层 /*** 新增胎架计划** param subsectionPlanVo* return*/PostMapping("/sched…