一、 引言

在《第11.16节 Python正则元字符“()”(小括号)与组(group)匹配模式》中老猿介绍了组匹配模式的命名组功能及引用组功能,这两者都是组模式的扩展功能,其实在re模块中组模式的扩展功能非常多,所有组模式的扩展功能,都是在组定义的左括号后面跟问号“?”来表示,具体扩展功能是要看问号后面的字符来确认,如“P”表示组名相关扩展。

下面介绍组匹配模式扩展功能的前视断言和前视取反,本节继本章后面介绍的扩展功能中组的括号内的“…”都表示一个合法的子模式正则表达式。

二、 (?=…)前视断言(lookahead assertion)

这种模式称为前视断言(有的翻译为前向断言、先行断言,老猿认为叫前向校验更符合功能的特征),其中…为一个合法的正则表达式。这种模式匹配时, …仅用于找到搜索文本中匹配的字符串的位置,但并不真正将搜索字符串作为匹配结果,也就是说,这种模式仅用于配合其他搜索模式定位搜索内容范围,本身不占用搜索串,对应搜索串还可以在接下来的解析中使用。这句话理解有点困难,我们举例来说明:

搜索文本为:Learning Python with LaoYuan,LaoYuanPython accompanies you to progress

要在搜索文本中查找“LaoYuanPython”中 “LaoYuan”的开始位置和结束位置,这个时候直接通过“LaoYuan”搜索就会搜索到第一个句子中的 “LaoYuan”(搜索文本中的位置为21-28),这个时候就需要用前视断言来定位“LaoYuanPython”中 的“LaoYuan” (搜索文本中的位置为29-36)。我们用普通搜索和加前视断言分别来搜索:

>>> re.search('LaoYuan','Learning Python with LaoYuan,LaoYuanPython accompanies you to progress')
<re.Match object; span=(21, 28), match='LaoYuan'>
>>> re.search('LaoYuan(?=Python)','Learning Python with LaoYuan,LaoYuanPython accompanies you to progress')#使用前视断言
<re.Match object; span=(29, 36), match='LaoYuan'>
>>>

从上面的搜索对比来看,两者搜索匹配到的字符串位置不同。

我们再在上面的基础上调整一下,在前视断言后再增加一个匹配模式,看匹配结果:

>>> m=re.search('(LaoYuan(?=Python))([A-Za-z]*)','Learning Python with LaoYuan,LaoYuanPython accompanies you to progress')#使用前视断言
>>> m.group(1,2)
('LaoYuan', 'Python')
>>>

可以看到,第二个组是从“LaoYuanPython”中 的“LaoYuan”后开始的,并没有因为前视断言使用了“Python”参与匹配而在后面的搜索中从“LaoYuanPython”后匹配,而是在“LaoYuanPython”的“LaoYuan”后开始匹配。

如果大家还是不能理解前视断言,可以参考一下老猿转发的文章《转:正则表达式的先行断言(lookahead)和后行断言(lookbehind)》

三、 (?!…) 前视取反(negative lookahead assertion)

也称为负向先行断言,该功能是与前视断言类似的功能,只是在查找位置时要求后面的串不能与…的要求匹配,即匹配字符串的结果应该是匹配…对应模式后求反。案例:

>>> re.search('(老猿(?!Python))([A-Za-z]*)','老猿Python,跟老猿学Python!')
<re.Match object; span=(10, 12), match='老猿'>
>>>

可以看到,匹配到的是后一个搜索词。

老猿Python,跟老猿学Python!

博客地址:https://blog.csdn.net/LaoYuanPython


请大家多多支持,点赞、评论和加关注!谢谢!

第11.19节 Python 中正则表达式的扩展功能:前视断言和前视取反的更多相关文章

  1. 第11.20节 Python 中正则表达式的扩展功能:后视断言、后视取反

    一. 引言 在<第11.19节 Python 中正则表达式的扩展功能:前视断言和前视取反>中老猿介绍了前视断言和前视取反,与二者对应的还有后视断言和后视取反. 二. (?<=-)后视 ...

  2. 第11.21节 Python 中正则表达式的其他扩展功能

    一. 引言 在<第11.17节 Python 正则表达式扩展功能:命名组功能及组的反向引用>中老猿介绍了组匹配模式的命名组功能及引用组功能,这两者都是正则表达式的扩展功能,其实在re模块中 ...

  3. 第7.19节 Python中的抽象类详解:abstractmethod、abc与真实子类

    第7.19节 Python中的抽象类详解:abstractmethod.abc与真实子类 一.    引言 前面相关的章节已经介绍过,Python中定义某种类型是以实现了该类型对应的协议为标准的,而不 ...

  4. 第11.23节 Python 中re模块的搜索替换功能:sub及subn函数

    一. 引言 在<第11.3节 Python正则表达式搜索支持函数search.match.fullmatch.findall.finditer>重点介绍了几个搜索函数,除了搜索,re模块也 ...

  5. 第11.22节 Python 中re模块的字符串分割器:split函数

    一. 引言 在<第11.2节 Python 正则表达式支持函数概览>介绍了re模块的主要函数,在<第11.3节 Python正则表达式搜索支持函数search.match.fullm ...

  6. 第11.18节 Python 中re模块的匹配对象

    匹配对象是Python中re模块正则表达式匹配处理的返回结果,用于存放匹配的情况.老猿认为匹配对象更多的应该是与组匹配模式的功能对应的,只是没有使用组匹配模式的正则表达式整体作为组0. 为了说明下面的 ...

  7. 第11.24节 Python 中re模块的其他函数

    一. re.compile函数 正则表达式编译函数,在后面章节专门介绍. 二. re.escape(pattern) re.escape是一个工具函数,用于对字符串pattern中所有可能被视为正则表 ...

  8. 第11.25节 Python正则表达式编译re.compile及正则对象使用

    一. 引言 在<第11.2节 Python 正则表达式支持函数概览>介绍了re模块的主要函数,在<第11.3节 Python正则表达式搜索支持函数search.match.fullm ...

  9. 第11.5节 Python正则表达式搜索任意字符匹配及元字符“.”(点)功能介绍

    在re模块中,任意字符匹配使用"."(点)来表示, 在默认模式下,点匹配除了换行的任意字符.如果指定了搜索标记re.DOTALL ,它将匹配包括换行符的任意字符.关于搜索标记的含义 ...

随机推荐

  1. vim编辑器的常用命令

    按ESC键跳到命令模式,然后::w - 保存文件,不退出 vim.:w file -将修改另外保存到 file 中,不退出 vim.:w! -强制保存,不退出 vim .:wq -保存文件,退出 vi ...

  2. 02模板渲染和参数(补充:URL传参到视图)

    先抛出代码: @app.route('/') def index(): return render_template('index.html',username ="郑勇") 问题 ...

  3. K-近邻算法kNN

    K-近邻算法(k-Nearest Neighbor,简称kNN)采用测量不同特征值之间的距离方法进行分类,是一种常用的监督学习方法,其工作机制很简单:给定测试样本,基于某种距离亮度找出训练集中与其靠近 ...

  4. Socket 结构体

    proto socket 关联结构: { .type = SOCK_STREAM, .protocol = IPPROTO_TCP, .prot = &tcp_prot, .ops = &am ...

  5. 如何开发一个maven插件

    maven是当下最流行的项目管理工具,其丰富的插件为我们的工作带来了很大的便利. 但是在一些情况下,开源的插件并不能完全满足我们的需求,我们需要自己创建插件,本文就从0开始带大家一起创建自己的插件. ...

  6. 3-colorability

    目录 1.1 3-colorability 1.1.1 3元可满足规约到3着色 1.1.2 证明充分和必要性 1.1 3-colorability 一个图的三着色问题:要使得边两头的结点颜色互不相同. ...

  7. SQL Server 批量生成数据库内多个表的表结构

    在遇到大型数据库的时候,一个数据库内存在大量的数据表,如果要生成多个表的表结构,一个表的检索,然后右键Create出来,太麻烦了. 下面我介绍下批量选择并生成多个表的表结构快捷方式,仅供参考. 第一步 ...

  8. 两种不同的扩展Scrum的方式

    两种不同的扩展Scrum的方式 1.LeSS和LeSS Huge –大型Scrum LeSS(和LeSS Huge –真正的大型程序)的合著者Craig Larman首先批评了管理,开发人员和客户传统 ...

  9. 我要进大厂之大数据ZooKeeper知识点(1)

    01 让我们一起学大数据 老刘又回来啦!在实验室师兄师姐都找完工作之后,在结束各种科研工作之后,老刘现在也要为找工作而努力了,要开始大数据各个知识点的复习总结了.老刘会分享出自己的知识点总结,一是希望 ...

  10. [原题复现]2019上海大学生WEB-Decade(无参数RCE、Fuzz)

    简介  原题复现:  考察知识点:无参数命令执行.Fuzz  线上平台:https://buuoj.cn(北京联合大学公开的CTF平台) 榆林学院内可使用信安协会内部的CTF训练平台找到此题 环境复现 ...