第11.19节 Python 中正则表达式的扩展功能:前视断言和前视取反
一、 引言
在《第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 中正则表达式的扩展功能:前视断言和前视取反的更多相关文章
- 第11.20节 Python 中正则表达式的扩展功能:后视断言、后视取反
一. 引言 在<第11.19节 Python 中正则表达式的扩展功能:前视断言和前视取反>中老猿介绍了前视断言和前视取反,与二者对应的还有后视断言和后视取反. 二. (?<=-)后视 ...
- 第11.21节 Python 中正则表达式的其他扩展功能
一. 引言 在<第11.17节 Python 正则表达式扩展功能:命名组功能及组的反向引用>中老猿介绍了组匹配模式的命名组功能及引用组功能,这两者都是正则表达式的扩展功能,其实在re模块中 ...
- 第7.19节 Python中的抽象类详解:abstractmethod、abc与真实子类
第7.19节 Python中的抽象类详解:abstractmethod.abc与真实子类 一. 引言 前面相关的章节已经介绍过,Python中定义某种类型是以实现了该类型对应的协议为标准的,而不 ...
- 第11.23节 Python 中re模块的搜索替换功能:sub及subn函数
一. 引言 在<第11.3节 Python正则表达式搜索支持函数search.match.fullmatch.findall.finditer>重点介绍了几个搜索函数,除了搜索,re模块也 ...
- 第11.22节 Python 中re模块的字符串分割器:split函数
一. 引言 在<第11.2节 Python 正则表达式支持函数概览>介绍了re模块的主要函数,在<第11.3节 Python正则表达式搜索支持函数search.match.fullm ...
- 第11.18节 Python 中re模块的匹配对象
匹配对象是Python中re模块正则表达式匹配处理的返回结果,用于存放匹配的情况.老猿认为匹配对象更多的应该是与组匹配模式的功能对应的,只是没有使用组匹配模式的正则表达式整体作为组0. 为了说明下面的 ...
- 第11.24节 Python 中re模块的其他函数
一. re.compile函数 正则表达式编译函数,在后面章节专门介绍. 二. re.escape(pattern) re.escape是一个工具函数,用于对字符串pattern中所有可能被视为正则表 ...
- 第11.25节 Python正则表达式编译re.compile及正则对象使用
一. 引言 在<第11.2节 Python 正则表达式支持函数概览>介绍了re模块的主要函数,在<第11.3节 Python正则表达式搜索支持函数search.match.fullm ...
- 第11.5节 Python正则表达式搜索任意字符匹配及元字符“.”(点)功能介绍
在re模块中,任意字符匹配使用"."(点)来表示, 在默认模式下,点匹配除了换行的任意字符.如果指定了搜索标记re.DOTALL ,它将匹配包括换行符的任意字符.关于搜索标记的含义 ...
随机推荐
- 腾讯云--腾讯云sdk-实现脚本修改腾讯云负载均衡权重
一.请确认你的当前python环境为python 2.x 获取 python 版本的方法 (linux shell) # python -v python 2.7.11 二.CLB SDK下载与配置 ...
- Spring笔记(7) - Spring的事件和监听机制
一.背景 事件机制作为一种编程机制,在很多开发语言中都提供了支持,同时许多开源框架的设计中都使用了事件机制,比如SpringFramework. 在 Java 语言中,Java 的事件机制参与者有3种 ...
- gdb 调试 报 stepping until--- has no line number information
gdb 经常用 ,但今天使用gdb 调试的时候, break 打断点, 结果也没有打出 哪一行的信息,就只是提示一个具体地址. 使用单步调试 结果爆出 stepping until exit from ...
- 04 . Vue组件注册,组件间数据交互,调试工具及组件插槽介绍及使用
vue组件 组件(Component)是 Vue.js 最强大的功能之一. 组件可以扩展 HTML 元素,封装可重用的代码. 组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用的 ...
- parted命令采用gpt分区过程
Gpt无分区限制,故只有主分区,无扩展分区和逻辑分区.分区直接按容量算,不按柱面算. 查看分区:parted -l 将分区表类型转换为gpt.: 主要命令mklabel gpt 对sdc盘分区: [r ...
- diamond收集插件的自定义
diamond是与graphite配合使用的一个数据收集的软件,关于这个配置的资料很多,使用起来也比较简单,详细的安装和配置会在后面的关于整套监控系统的文章里面写到,本篇是专门讲解怎么自定义这个数据收 ...
- Spring第四天,BeanPostProcessor源码分析,彻底搞懂IOC注入及注解优先级问题!
- Android ContentProvider 启动分析
对于 ContentProvider 还不是很熟悉的同学,可以阅读上一篇 Android ContentProvider 基本原理和使用详解.本文主要是对 contentProvider 的源码进行分 ...
- ctf-工具-binwalk
binwalk在玩杂项时是个不可缺的工具.1.最简单的,在玩隐写时,首先可以用它来找到其中的字符串例如:在铁人三项,东北赛区个人赛中,有一道题它直接给了一个文件,没有后缀,不知道是什么文件先binwa ...
- ABBYY FineReader 15 查看和编辑PDF
使用ABBYY FineReader 15(Windows系统)OCR文字识别软件,用户可轻松查看和编辑各种类型的PDF数字文档,并可在文档中添加注释.添加与删除文字.格式化文字.搜索内容.保护PDF ...