一、 引言

在《第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. 1. Spark的安装及介绍

    *以下内容由<Spark快速大数据分析>整理所得. 读书笔记的第一部分是记录如何安装Spark?同时,简单介绍下Spark. 一.Spark安装 二.Spark介绍 一.Spark安装 如 ...

  2. mdp文件-Chapter3-NPT.mdp

    mdp系列的第三篇,对NPT模拟中的mdp文件做一简单介绍. 先上代码 1 title = OPLS Lysozyme NPT equilibration 2 define = -DPOSRES ; ...

  3. 【JVM第七篇】执行引擎

    写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 执行引擎是Java虚拟机中的核心组成部分. 执行引擎的作用就是解析虚拟机字节码指令, ...

  4. MySQL 5.x乱码问题解决

    MySQL是一款常用的开源数据库软件,但是对于初次使用者好像并不是太友好,MySQL5.x的版本中默认字符集是latin1也就是我们所知道的ISO-8859-1字符集,这个字符集编码并没有包含汉字,所 ...

  5. SpringBoot 之 @ControllerAdvice 拦截异常并统一处理

    在spring 3.2中,新增了@ControllerAdvice 注解,可以用于定义@ExceptionHandler.@InitBinder.@ModelAttribute,并应用到所有@Requ ...

  6. [原题复现]SUCTF 2019 WEB EasySQL(堆叠注入)

    简介  原题复现: 1 <?php 2 session_start(); 3 4 include_once "config.php"; 5 6 $post = array() ...

  7. sqlilab less19-less22

    less19 当账号密码正确时,会将当前的refer和ip存入数据库.对这两个值同时没有进行过滤.考虑使用sqlmap对这两个参数进行注入 less-20 当cookie uname存在时,并且不是p ...

  8. git设置个人信息

    git config --global user.name "username" 设置下自己提交的用户名 git config --global user.email " ...

  9. 总是说spring难学?来看完这些spring的注解及其解释,真香!

    前言 用过spring的人都知道,spring简单的通过注解就可以完成很多事情,但这些东西是如何实现的呢以及如何应用到我们自己的代码中?接下来,让我们一起开启注解的旅程. 1. @Controller ...

  10. 在CorelDRAW中如何完成属性的复制

    复制功能在任何一个编辑软件中都是必不可少.使用率很高的一个功能,在矢量图形设计软件CorelDRAW 中也不例外.关于对象的复制这里就不过多示意了,主要为大家示范一下如何在设计中复制对象的一些属性. ...