当前位置: 首页 > news >正文

请以零基础学Python 之 第二十讲 分组和贪婪匹配

当我们处理字符串时,有时候需要根据特定的模式来分割或者提取信息。Python 提供了强大的正则表达式库 re,可以帮助我们实现这些复杂的字符串操作。本篇博客将介绍两个常用的正则表达式技巧:分组和贪婪匹配。

分组(Grouping)

在正则表达式中,分组是将多个模式单元组合为一个单元,以便对其进行操作。分组通过圆括号 () 实现,它可以帮助我们实现以下几种功能:

  1. 提取子模式: 可以将匹配的字符串中的一部分单独提取出来。
  2. 应用操作符: 可以在分组上应用操作符,如*+? 等,以控制匹配的重复次数。
示例

假设我们有一个字符串,包含日期和时间信息,格式如下:2023-07-31 08:30。我们想要分别提取出日期和时间部分。

import retext = '2023-07-31 08:30'pattern = r'(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2})'match = re.match(pattern, text)if match:print(f'Date: {match.group(1)}')print(f'Time: {match.group(2)}')
else:print('No match')

在这个例子中,正则表达式 (\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}) 中的两个分组分别提取了日期和时间。match.group(1) 返回日期部分,match.group(2) 返回时间部分。

贪婪匹配(Greedy Matching)

正则表达式默认是贪婪匹配的,意味着它会尽可能匹配最长的字符串。这在某些情况下可能不是我们想要的行为。为了避免贪婪匹配,我们可以使用 ? 操作符来指示正则引擎使用非贪婪模式。

示例

假设我们有一个包含 HTML 标签的字符串,如 <div><p>Hello</p></div>,我们想要匹配其中的第一个 div 标签内容。

import rehtml = '<div><p>Hello</p></div>'pattern = r'<div>(.*?)</div>'match = re.search(pattern, html)if match:print(f'Content inside <div>: {match.group(1)}')
else:print('No match')

在这个例子中,正则表达式 <div>(.*?)</div> 中的 .*? 是一个非贪婪模式,用来匹配最短的可能内容(即第一个 <div> 和最近的 </div> 之间的内容),而不是默认的贪婪模式匹配整个字符串。

结论

通过使用分组和非贪婪匹配,我们可以更灵活地处理复杂的字符串操作。正则表达式作为强大的工具,可以帮助我们从文本中提取所需信息,进行数据处理和分析。在学习和应用正则表达式时,理解这些概念是非常重要的,它们能够大大提高我们处理文本数据的效率和准确性。希望本文能帮助零基础学习者更好地掌握 Python 中的正则表达式技巧。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 从新手到高手:Scala函数式编程完全指南,Scala 文件 I/O(27)
  • 【LLM】-10-部署llama-3-chinese-8b-instruct-v3 大模型
  • 类似redmine的项目管理系统有哪些?10款软件测评
  • 基础跟张宇,强化换武忠祥可行吗?会不会漏什么?
  • Flask目录结构路由重定向简单实例讲解——轻量级的 Python Web 框架
  • 【数据结构】——堆的实现与算法
  • ElasticSearch父子索引实战
  • 怎么用U盘重装系统
  • ansible笔记
  • go 语言踏出第一步
  • 【Stable Diffusion】(基础篇七)—— lora
  • AI-WEB-1.0 靶机
  • 2024年8月1日 十二生肖 今日运势
  • 库文件的制作和makefile文件操作基础实现
  • 尚品汇-CompletableFuture异步编排-优化商品详情页(二十五)
  • 「面试题」如何实现一个圣杯布局?
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • 2019.2.20 c++ 知识梳理
  • C++类的相互关联
  • CSS3 变换
  • es6(二):字符串的扩展
  • GraphQL学习过程应该是这样的
  • Java IO学习笔记一
  • js正则,这点儿就够用了
  • Python十分钟制作属于你自己的个性logo
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • SpringBoot几种定时任务的实现方式
  • 编写符合Python风格的对象
  • 对超线程几个不同角度的解释
  • 机器学习学习笔记一
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 简单实现一个textarea自适应高度
  • 精彩代码 vue.js
  • 排序算法之--选择排序
  • 实现菜单下拉伸展折叠效果demo
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • #includecmath
  • (2)nginx 安装、启停
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (70min)字节暑假实习二面(已挂)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第6节 (嵌套的Finally代码块)
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (第27天)Oracle 数据泵转换分区表
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (五)网络优化与超参数选择--九五小庞
  • (转)jQuery 基础
  • (转)mysql使用Navicat 导出和导入数据库
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET MVC 验证码
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例