一、 引言

在《第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. python08豆瓣电影 爬虫 BeautifulSoup + Reuqests

    主要思路 请求豆瓣的链接获取网页源代码 然后使用 BeatifulSoup 拿到我们要的内容 最后就把数据存储到 excel 文件中

  2. 分布式流平台Kafka

    提到Kafka很多人的第一印象就是它是一个消息系统,但Kafka发展至今,它的定位已远不止于此,而是一个分布式流处理平台.对于一个流处理平台通常具有三个关键能力: 1. 发布和订阅消息流,在这一点上它 ...

  3. ixgbe 驱动 为xxx驱动做准备1

    网卡都是pci设备,因此这里每个网卡驱动其实就是一个pci驱动.并且intel这里是把好几个万兆网卡(82599/82598/x540)的驱动做在一起的.V4L2 一样几个类型摄像头合并在一起 先说一 ...

  4. 关于android.view.InflateException【转载】

    在AndroidStudio中编译没有问题,但是运行时会crash,常发生于自定义View的引用.出现问题的原因大致分为以下几种 1.引用View的路径问题:如果自定义的view为CustomerVi ...

  5. C语言设计模式(自我揣摩)

    NBModule.h #ifndef _NBMODULEFRAME_H__ #define _NBMODULEFRAME_H__ #include "total.h" enum N ...

  6. CSS属性(CSS盒子模型)

    1.CSS盒子模型 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset=&q ...

  7. window.frames["id"].location使用

    由于最近需要维护一个老项目不得不去学习一些自己都没接触过的项目,老项目中虽然技术已经被淘汰,但是思想还是值得去学习探究的,无论是jsp,freemarker,freemarker这些模板引擎还是Vue ...

  8. CVE-2017-11882利用

    CVE-2017-11882是微软公布的远程执行漏洞,通杀所有office版本及Windows操作系统 工具使用 本文使用的EXP来源于unamer/CVE-2017-11882,然后结合MSF进行渗 ...

  9. 建议收藏!2020阿里面试题(JVM+Spring Cloud+微服务)上

    前言 对于大厂面试,我想要强调的一点就是心态真的很重要,是决定你在面试过程中发挥的关键,若不能正常发挥,很可能就因为一个小失误与offer失之交臂,所以一定要重视起来.另外提醒一点,充分复习,是消除你 ...

  10. 在IDM上设置防止过度抓取网站信息

    在使用Internet Download Manager(IDM)下载器时,有时会发现IDM自带的抓取功能过于强大,以至于有时会抓取一些无效的链接.那么,该如何避免IDM的过度抓取呢? 图1:IDM的 ...