Python3 如何优雅地使用正则表达式(详解四)

2023-11-16

更多强大的功能

到目前为止,我们只是介绍了正则表达式的一部分功能。在这一篇中,我们会学习到一些新的元字符,然后再教大家如何使用组来获得被匹配的部分文本。


更多元字符

还有一些元字符我们没有讲到,接下来小甲鱼一一为大家讲解。

有些元字符它们不匹配任何字符,只是简单地表示成功或失败,因此这些字符也称之为 零宽断言 。例如  \b  表示当前位置位于一个单词的边界,但  \b  并不能改变位置。因此,零宽断言不应该被重复使用,因为  \b  并不会修改当前位置,所以  \b\b 跟  \b  是没什么两样的。

小甲鱼解释:很多人可能不理解“改变位置”和“零宽断言”的意思?我尝试解释下,比如 abc 匹配完 a 之后,咱的当前位置就会移动,才能继续匹配 b,依次类推...但是 \babc 的话,\b 表示当前位置在单词的边界(单词的第一个字母或者最后一个字母),这时候当前位置不会发生改变,接着将 a 与当前位置的字符进行匹配......


|

或操作符,对两个正则表达式进行或操作。如果 A 和 B 是正则表达式, A | B  会匹配  A  或  B  中出现的任何字符。为了能够更加合理的工作, |  的优先级非常低。例如  Fish|C  应该匹配  Fish  或  C ,而不是匹配  Fis ,然后一个  'h'  或  'C'

同样,我们使用  \|  来匹配  '|'  字符本身;或者包含在一个字符类中,像这样  [|]


^

匹配字符串的起始位置。如果设置了 MULTILINE 标志,就会变成匹配每一行的起始位置。在 MULTILINE 中,每当遇到换行符就会立刻进行匹配。

举个例子,如果你只希望匹配位于字符串开头的单词 From,那么你的正则表达式可以写为 ^From:
  1. >>> print(re.search('^From', 'From Here to Eternity'))  
  2. < _sre.SRE_Match object; span=(0, 4), match='From'>
  3. >>> print(re.search('^From', 'Reciting From Memory'))
  4. None
复制代码


$

匹配字符串的结束位置,每当遇到换行符也会离开进行匹配。

>>> print(re.search('}$', '{block}'))  
<_sre.SRE_Match object; span=(6, 7), match='}'>
>>> print(re.search('}$', '{block} '))
None
>>> print(re.search('}$', '{block}\n'))  
<_sre.SRE_Match object; span=(6, 7), match='}'>

同样,我们使用  \$  来匹配  '$'  字符本身;或者包含在一个字符类中,像这样  [$]


\A

只匹配字符串的起始位置。如果没有设置 MULTILINE 标志的时候, \A  和  ^  的功能是一样的;但如果设置了 MULTILINE 标志,则会有一些不同: \A  还是匹配字符串的起始位置,但  ^  会对字符串中的每一行都进行匹配。


\Z

只匹配字符串的结束位置。


\b

单词边界,这是一个只匹配单词的开始和结尾的零宽断言。“单词”定义为一个字母数字的序列,所以单词的结束指的是空格或者非字母数字的字符。

下边例子中, class  只有在出现一个完整的单词  class  时才匹配;如果出现在别的单词中,并不会匹配。
  1. >>> p = re.compile(r'\bclass\b')
  2. >>> print(p.search('no class at all'))  
  3. < _sre.SRE_Match object; span=(3, 8), match='class'>
  4. >>> print(p.search('the declassified algorithm'))
  5. None
  6. >>> print(p.search('one subclass is'))
  7. None
复制代码

在使用这些特殊的序列的时候,有两点是需要注意的:第一点需要注意的是,Python 的字符串跟正则表达式在有些字符上是有冲突的(回忆之前反斜杠的例子)。比如说在 Python 中, \b  表示的是退格符(ASCII 码值是 8)。所以,你如果不使用原始字符串,Python 会将  \b  转换成退格符处理,这样就肯定跟你的预期不一样了。

下边的例子中,我们故意不写表示原始字符串的  'r' ,结果确实大相庭径:
  1. >>> p = re.compile('\bclass\b')
  2. >>> print(p.search('no class at all'))
  3. None
  4. >>> print(p.search('\b' + 'class' + '\b'))  
  5. < _sre.SRE_Match object; span=(0, 7), match='\x08class\x08'>
复制代码

第二点需要注意的是,在字符类中不能使用这个断言。跟 Python 一样,在字符类中, \b  只是用来表示退格符。


\B

另一个零宽断言,与  \b  的含义相反, \B  表示非单词边界的位置。


分组

通常在实际的应用过程中,我们除了需要知道一个正则表达式是否匹配之外,还需要更多的信息。对于比较复杂的内容,正则表达式通常使用分组的方式分别对不同内容进行匹配。

下边的例子,我们将 RFC-822 头用“:”号分成名字和值分别匹配:

  1. From: author@example.com
  2. User-Agent: Thunderbird 1.5.0.9 (X11/20061227)
  3. MIME-Version: 1.0
  4. To: editor@example.com
复制代码

像这种情况,我们就可以写一个正则表达式先来匹配一整个 RFC-822 头,然后利用分组功能,使用一个组来匹配头的名字,另一个组匹配名字对应的值。

小甲鱼解释:RFC-822 是电子邮件的标准格式,当然看到这里你还不知道分组要怎么分,不急,请接着往下看......

在正则表达式中,使用元字符  ( )  来划分组。 ( )  元字符跟数学表达式中的小括号含义差不多;它们将包含在内部的表达式组合在一起,所以你可以对一个组的内容使用重复操作的元字符,例如  * + ?  或者  {m, n}

例如, (ab)*  会匹配零个或者多个  ab

  1. >>> p = re.compile('(ab)*')
  2. >>> print(p.match('ababababab').span())
  3. (0, 10)
复制代码

使用  ( )  表示的子组我们还可以对它进行按层次索引,可以将索引值作为参数传递给这些方法:group(),start(),end() 和 span()。序号 0 表示第一个分组(这个是默认分组,一直存在的,所以不传入参数相当于默认值 0):

  1. >>> p = re.compile('(a)b')
  2. >>> m = p.match('ab')
  3. >>> m.group()
  4. 'ab'
  5. >>> m.group(0)
  6. 'ab'
复制代码

小甲鱼解释:有几对小括号就是分成了几个子组,例如 (a)(b) 和 (a(b)) 都是由两个子组构成的。

子组的索引值是从左到右进行编号,子组也允许嵌套,因此我们可以通过从左往右来统计左括号  (  来确定子组的序号。

  1. >>> p = re.compile('(a(b)c)d')
  2. >>> m = p.match('abcd')
  3. >>> m.group(0)
  4. 'abcd'
  5. >>> m.group(1)
  6. 'abc'
  7. >>> m.group(2)
  8. 'b'
复制代码

group() 方法可以一次传入多个子组的序号:

  1. >>> m.group(2,1,2)
  2. ('b', 'abc', 'b')
复制代码

小甲鱼解释:start() 是获得参数子组的开始位置;end() 是获得对应子组的结束位置;span() 是获得对应子组的范围。

我们还特么可以通过 groups() 方法一次性返回所有的子组匹配的字符串:

  1. >>> m.groups()
  2. ('abc', 'b')
复制代码

还有一个反向引用的概念需要介绍。反向引用指的是你可以在后面的位置使用先前匹配过的内容,用法是反斜杠加上数字。例如 \1 表示引用前边成功匹配的序号为 1 的子组。
  1. >>> p = re.compile(r'(\b\w+)\s+\1')
  2. >>> p.search('Paris in the the spring').group()
  3. 'the the'
复制代码


如果只是搜索字符串,反向引用不会被用到,因为很少有文本格式会这样来重复字符。但是,你很快会发现,在字符串替换的时候,反向引用是非常有用的(深井冰)!

小甲鱼注释:注意,在 Python 的字符串中会使用反斜杠加数字的方式来表示数字的值对应的 ASCII 字符,所以在使用反向索引的正则表达式中,我们依然强调要使用原始字符串。


原文连接:点击打开链接



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python3 如何优雅地使用正则表达式(详解四) 的相关文章

  • python3 with.py

    模块 python3 with py 参考 https docs python org zh cn 3 reference compound stmts html with https docs python org zh cn 3 ref
  • python3生成中文词云图

    usr bin python3 coding utf 8 coding utf 8 导入wordcloud模块 from wordcloud import WordCloud 中文分词库 pip install jieba import j
  • 正则表达式大全

    1 匹配中文 u4e00 u9fa5 2 英文字母 a zA Z 3 数字 0 9 4 匹配中文 英文字母和数字及下划线 u4e00 u9fa5 a zA Z0 9 同时判断输入长度 u4e00 u9fa5 a zA Z0 9 4 10 5
  • 截取oracle字符串中的数字(转载)

    截取oracle字符串中的数字 云淡风轻博客 博客园 cnblogs com 方法一 如果Oracle版本不是太低的话 使用 正则表达式函数 REGEXP SUBSTR 处理 REGEXP SUBSTR有5个参数 分别是 第一个是输入的字符
  • IDEA正则表达式高级替换

    1 需求 需要将如下注释转换成另外一个形式 员工姓名 private String name 员工姓名 private String name 2 在idea中输入正则表达式进行快速替换 3 具体的正则表达式如下 替换前正则 替换后正则 1
  • SparkSQL HiveSQL 常用正则表达式

    SparkSQL HiveSQL 常用正则表达式 目录 SparkSQL HiveSQL 常用正则表达式 1 匹配汉字 2 匹配手机号码 3 匹配身份证 4 SparkSQL HiveSQL 常用正则函数 5 SparkSQL 分组 聚合
  • Nmap源码分析(服务与版本扫描)

    Nmap源码分析 服务与版本扫描 2012年8月23日 在进行端口扫描后 Nmap可以进一步探测出运行在端口上的服务类型及应用程序的版本 目前Nmap可以识别几千种服务程序的签名 Signature 覆盖了180多种应用协议 比如 端口扫描
  • Pattern.compile的flag参数

    Pattern compile函数 Pattern Pattern compile String regex int flag regex为正则表达式 flag的取值范围如下 Pattern CANON EQ 当且仅当两个字符的 正规分解
  • JavaScript最后分水岭——正则表达式

    个人简介 个人主页 微风洋洋 博客领域 编程基础 后端 写作风格 干货 干货 还是tmd的干货 精选专栏 JavaScript 支持洋锅 点赞 收藏 留言 好久不见 甚是想念 大家好 我是微风洋洋 也可以叫我洋锅 细心地小伙伴可能已经发现
  • python3 练习题100例 (十二)

    题目十二 打印出所有的 水仙花数 所谓 水仙花数 是指一个三位数 其各位数字立方和等于该数本身 例如 153是一个 水仙花数 因为153 1的三次方 5的三次方 3的三次方 usr bin env python3 coding utf 8
  • 正则表达式大全,一篇前后端都可用

    正是掌握了这些正则表达式 冰河平均每天比别人少写200行代码 极大的提高了研发效率 熟练的掌握正则表达式 能够帮助程序员以最快的速度写出最优雅的代码 冰河在多年的编程工作中 对使用过的正则表达式进行了梳理和总结 这些正则表达式能够帮助你节省
  • re模块----你也可以玩得很溜正则表达式

    目录 re模块 compile pattern flags 0 flag匹配模式 match pattern string flags 0 search pattern string flags 0 findall pattern stri
  • python request要求接口参数必须是json数据

    Reqeusts支持以form表单形式发送post请求 只需要将请求的参数构造成一个字典 然后传给requests post 的data参数即可 data参数的格式如下 content type在header中设置 1 data为dict时
  • js正则表达式

    w3school 正则表达式 一 正则表达式的使用 首先 我们一般使用正则表达式用来进行验证邮箱手机号等 进行匹配 1 编写一个正则表达式 var rule 我是一个正则表达式 2 使用正则表达式来进行验证 var isrule rule
  • 正则表达式工具类

    在实际开发中总会使用到正则表达式匹配数据 我也是在后面查看了一些资料 下面写一个常用的正则表达式匹配集合 正则匹配模式 表示匹配字符串的开始位置 例外 用在中括号中 时 可以理解为取反 表示不匹配括号中字符串 表示匹配字符串的结束位置 表示
  • regex_replace()函数的应用与解析

    include
  • C#中Validating和Validated事件

    您可能经常需要检查用户输入到 Windows 窗体中的信息是否有效 例如 如果您有一个电话号码的 TextBox 控件 则可以检查该控件是否只包含适当的字符 数字 括号和连字符等等 通常 可使用正则表达式验证用户输入的数据 了解Valida
  • Java 正则表达式工具类大全

    import java util regex Matcher import java util regex Pattern author nql Description 验证工具类 date now public class Validat
  • JavaEE - 正则表达式、日期时间类、Math、Random、System、Runtime、大数值运算类

    一 正则表达式 用来描述或者匹配一系列符合某个语句规则的字符串 正则表达式定义了字符串的模式 可以用来搜索 编辑或处理文本 正则表达式是由普通字符 例如字符 a 到 z 以及特殊字符 称为 元字符 组成的文字模式 模式描述在搜索文本时要匹配
  • 常用表单正则表达式

    校验 大小写字母 汉字 export const verifyCheEng a zA Z p sc Han gu 校验 数字 大小写字母 汉字 export const verifyCheEngNum a zA Z0 9 p sc Han

随机推荐

  • AXI DMA学习

    AXI总线协议 一 概述 AXI 高性能扩展总线接口 Advanced eXtensible Interface 是ARM AMBA 单片机总线系列中的一个协议 是计划用于高性能 高主频的系统设计的 AXI协议是被优化用于通过使用Xilin
  • ibms智能化系统集成服务器,智能化集成管理系统(IBMS)

    IBMS是在BMS的基础上更进一步的与通信网络系统 信息网络系统实现更高一层的建筑集成管理系统 IBMS 就是建立在5A集成之上的更高层次的集成 5A是指OA 办公智能化 BA 楼宇自动化 CA 通讯传输智能化 FA 消防智能化 SA 安保
  • JAVA多态机制简述

    多态是指方法或对象具有多种形态 是oop的第三大特征 其是建立在封装和继承之上的 多态的体现 1 方法多态 1 重载体现多态2 重写体现多态 2 对象多态 1 对象的编译类型和运行类型可以不一致 编译类型在编译时就会确定 2 对象的运行类型
  • 渗透测试--medium_socnet

    靶机下载地址 https download vulnhub com boredhackerblog medium socnet ova 实验环境 Kali IP 192 168 172 134 靶机 medium socnet 主机发现 a
  • QT学习——QTreeView获取选中单行数据和多行数据

    个人感觉QTreeView有些地方的使用没有MFC的CListCtrl方便 比如在不响应单击信号的情况下 获取选中行的数据 单行和多行 也许因为我是新手吧 一 获取单行选中的数据 QModelIndex selected ui treeVi
  • 自学c++笔记(二)

    笔记记录本人学习C 路上的一些摘要与总结 供本人阅读同时也分享与他人 变量的定义 int carrots carrot 25 cout lt lt carrots 会输出25 int 表示整数 carrot 来标识存储在该内存单元的值 co
  • manjaro主目录设置英文

    终端 vim config user dirs dirs 把对应的换成英文 然后命令 mv 下载 Downloads mv 桌面 Desktop mv 模板 Templates 全部 mv
  • 2点云--数据结构

    根据激光测量原理得到的点云 包含三维坐标信息 xyz 和激光反射强度信息 intensity 激光反射强度与仪器的激光发射能量 波长 目标的表面材质 粗糙程度 入射角相关 基本类型PointCloud PCL的基本数据类型是PointClo
  • 海康PS转H264的编码思想(带图码流解释)

    海康PS转H264的编码思想 带图码流解释 本人PS流解析成H264的其余文章 01PS流格式 02封装时遇到的重点问题 03海康PS转H264的编码思想 带图码流解释 1 海康的PS流发包的顺序到底是如何发送的 根据01PS流格式我们知道
  • 关于敷铜全连接和十字连接

    敷铜时 地层要采用十字连接 因为一般在TOP或者BOTTOM层会全敷铜 采用十字连接会降低散热速度 而电源层要采用全连接
  • html gif无限循环播放,【GIF】无限循环GIF太神奇,有人知道这是怎么做的吗?

    今天橘子君给大家介绍一位土耳其摄影艺术家Erdal Inci的GIF作品 有没有感觉是无限循环的 没错 无限循环的动态影像作品 现在使用GIF也能办到 土耳其摄影艺术家 Erdal Inci 把运动人物连续的动作合成到同一个画面 并做成循环
  • PROFIBUS DP从站开发 VPC3源程序分析---vpc3_cfg_data_not_ok(void)

    以下程序注释由成都地质学院霸王猫添加 引用时请尊重作者劳动成果 标明引用者来自成都地质学院霸王猫 UBYTE vpc3 cfg data not ok void 入口参数 无 出口参数 无 返回值 VPC3 CFG FINISHED VPC
  • Python最常用的7个框架讲解!

    众所周知 Python语言中内置了很多框架 拿来即用 为我们的工作带来了很多便利 也提高了效率 本文为大家介绍7种常见且实用的Python框架 主要包括 Django flask scrapy Diesel Cubes Pulsar和Tor
  • Apipost,更懂中国程序员的接口调试神器

    Hello 大家好 我是灰小猿 一个超会写bug的程序猿 作为一名Java后端程序猿 对接口调试简直是家常便饭 尤其是在进行接口联调的时候 往往因为和前端对接口的理解程度不同 于是乎就出现了 而且 程序员的蹩脚英语往往是不能区分Java和j
  • 修改Tomcat的默认端口号

    1 找到Tomcat的安装路径 2 打开conf文件夹 3 用记事本打开server xml文件 4 找到
  • 从Vue-cli脚手架的基本使用到vue路由的基本使用

    第一部分 Vue cli脚手架 vue2是对新手很友好的MVVM框架 有完善的官方中文文档 阅读起来也非常容易理解 由浅入 深 示例完整 同时官方也提供了一个开箱即用的 vue cli 帮我们生成一个完整的项目框架 vue js 著名的全家
  • linux运行python代码进行训练时断开服务器中断训练解决办法

    无论是远程连接服务器还是将服务资源拉取的pycharm中使用 都会存在一个问题 就是远程客户端关闭后 服务端的训练就会终止 这样对于远程客户端的限制就非常大 为了解决这个问题 只需要在训练时按照下面命令操作即可完成 第一步 nohup py
  • Pytest的乐趣

    Pytest的乐趣 前言 安装 关键词test 关键词assert 进阶一 参数 进阶二 软断言 进阶三 配置文件pytest ini 进阶四 前后设置 进阶五 并行测试 进阶六 命令行参数扩展 前言 Pytest就是为了测试已经完成的Py
  • centos7下使用yum安装mysql数据库

    分享下装mysql数据库的过程以及远程连接的方法 整合了部分网上的资源以及自己遇到的一些问题 常用的一些命令就不一 一介绍了 话不多说 马上开始 1 下载mysql的repo源 wget http repo mysql com mysql
  • Python3 如何优雅地使用正则表达式(详解四)

    更多强大的功能 到目前为止 我们只是介绍了正则表达式的一部分功能 在这一篇中 我们会学习到一些新的元字符 然后再教大家如何使用组来获得被匹配的部分文本 更多元字符 还有一些元字符我们没有讲到 接下来小甲鱼一一为大家讲解 有些元字符它们不匹配