一、引言

在《第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.search('LaoYuan(?=Python)','Learning Python with LaoYuan,LaoYuanPython accompanies you to progress')#使用前视断言

>>>

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

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

>>> 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!')

>>>

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

python正则怎么取反_第11.19节 Python 中正则表达式的扩展功能:前视断言和前视取反...相关推荐

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

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

  2. 第11.19节 Python 中正则表达式的扩展功能:前视断言和前视取反

    一. 引言 在<第11.16节 Python正则元字符"()"(小括号)与组(group)匹配模式>中老猿介绍了组匹配模式的命名组功能及引用组功能,这两者都是组模式的扩 ...

  3. 第11.16节 Python正则元字符“()”(小括号)与组(group)匹配模式

    一. 什么是组 关于组匹配模式,Python官网上说得比较简单,也没有这个名词,只有组这个名词,老猿查了比较多的资料和做了相关测试之后才理解. 组匹配模式,就是在匹配的正则表达式中使用小括号" ...

  4. 第11.15节 Python正则表达式转义符定义的特殊序列

    一. 引言 在前面<第11.13节 Python正则表达式的转义符"\"功能介绍>介绍了正则表达式转义符'\',只不过当时作为转义符主要是用于在正则表达式中表示元字符自 ...

  5. math python 向上取整_计算机等级考试二级Python语言模拟试卷单选解答详解第1期...

    模拟试卷单选题20题 有粉丝私信希望增加一些针对国家二级Python考级的小练习和答题详解.所以就有了模拟试卷的题目讲解. 第1题:下面的程序运行结果是( ) 解答: 这是一个变量作用域的问题,变量分 ...

  6. python 除法取模_跟我一起学python | 探究05

    算术运算.比较运算.赋值运算.位和位运算.运算优先级 python里的算术运算 我们最熟悉的计算就是算术运算,加减乘除等.在python的算术运算中,除了四则运算外,还有幂运算.取模.取整运算. 什么 ...

  7. python 取模_中年大叔学编程-Python的基础语法和运算符

    编程语言中都有语法,就是你按照语法规则来,程序才会顺利编译通过.今天我就来了解一下Python的基本语法. 保留关键字 保留关键字就是Python内置已经被使用了的关键字,我们不能用来自定义为变量名或 ...

  8. python公开课乐博学院_当我学完 Python ,我学会了些什么【乐搏TestPRO】

    本文是本人学完Python后的一遍回顾,加深理解顺便留作手册以备查阅. 学习Python的这几天来,觉得Python还是比较简单,容易上手的,就基本语法而言,但是有些高级特性掌握起来还是有些难度,需要 ...

  9. python程序设计简明教程知识点_[转载]看完《python简明教程》笔记及第一个python程序...

    主要是摘抄了一些书上需要注意的地方: 1.Python 是一门解释性语言. 在计算机内部, Python 解释器把源代码转换成称为字节码的中间形式,然后再把它翻译成计算机使用的机器语言并运行. 2.版 ...

最新文章

  1. Python 环境搭建
  2. 每天一点C++(之四)
  3. python tip
  4. 文件的上传下载(一)
  5. arm-linux-gcc: No such file or directory
  6. python 项目发布会_发布会直播技术及业务实践
  7. Python将字符串转换为列表
  8. 一些常用PLSQL语句 和事务
  9. 让前端走进微时代, 微微一弄很哇塞!
  10. c语言中可以使用setw函数吗,string和stringstream+setw()用法总结
  11. 《智能路由器开发指南》核心笔记(全)——转载的
  12. 利用html标记制作静态网页,使用HTML制作网页《静态网页制作》.ppt
  13. Linux 磁盘分区(MBR和GPT,loop详细分区方法介绍)
  14. 构建数据思维从认知事物的基本方法开始!
  15. HGAME2022 Web WP
  16. 【入木三分】的意思和解释
  17. 无领导小组讨论面试真题解析(十一)—— 面包与记者
  18. 论文阅读——BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
  19. 蘑菇钉导出周报提交情况没有周次,自己写一个导出
  20. eclipse html乱码

热门文章

  1. 常用docker命令
  2. Chapter 3 Phenomenon——6
  3. 用python绘制叠加等边三角形_python 叠加等边三角形的绘制的实现
  4. golang mysql 回调_Golang操作MySQL的正确姿势
  5. 新海诚没有参与制作的作品_新海诚简介和所有作品列表
  6. 辐流式重力浓缩池计算_注册考试重点!平流式、竖流式、辐流式、斜板式4大沉淀池构型...
  7. 事务例子_Spring事务专题(四)Spring中事务的使用、抽象机制及模拟Spring事务实现...
  8. json 解析_json爬坑1:yajl解析json
  9. decimal转换为int_“System.InvalidCastException 指定的转换无效”问题的反思和总结
  10. 苏强SN系列服务器说明书,第一章 SN2000交流伺服驱动器使用手册.pdf