1. 什么是零宽断言
  有时候在使用正则表达式做匹配的时候,我们希望匹配一个字符串,这个字符串的前面或后面需要是特定的内容,但我们又不想要前面或后面的这个特定的内容,这时候就需要零宽断言的帮助了。所谓零宽断言,简单来说就是匹配一个位置,这个位置满足某个正则,但是不纳入匹配结果的,所以叫“零宽”,而且这个位置的前面或后面需要满足某种正则。

2、不同的零宽断言

  零宽断言:正向反向两类,每类又分为:预测先行回顾后发

  

  正预测先行:简称正向先行断言,语法:(?=exp),它断言此位置的后面能匹配表达式exp,但不包含此位置;
  如:a(?=\d),返回匹配字符串中以数字为结尾的a字符。

  正回顾后发:简称正向后发断言,语法:(?<=exp),它断言此位置的前面能匹配表达式exp;
  如:(?<=\d)a,返回匹配字符串中以数字为开头的a字符。

  负预测先行:简称反向先行断言,语法:(?!exp),它断言此位置的后面不能匹配表达式exp;
  如:a(?!\d),返回不匹配字符串中以数字结尾的a字符。

  负回顾后发:简称反向后发断言,语法:(?<!exp),它断言此位置的前面不能匹配表达式exp;
  如:a(?<!exp)a,返回不匹配字符串中以数字开头的a字符。

  

3、零宽断言的实践与总结

  示例:提取<div>Hello World</div>中Hello World

  目标字符串:Hello World

  根据以上所说,当我们需要提取字符串的时候,可以用断言,思路如下:

  首先,目标字符串是hello world,那么它可以归纳为 .* 

  其次,目标字符串前面有<div>,既然是前面有,那么根据四种断言的含义,容易得出用正向后发断言(?<=exp),将它放在目标字符串前面,得到(?<=<div>).*,进一步可以将div归纳为[a-zA-Z]+,从而得到(?<=<[a-zA-Z]+>).*

  最后,目标字符串后面有</div>,既然是后面有,那么根据四种断言的含义,容易得出用正向先行断言(?=exp),将它放在目标字符串后面,从而得到(?<=<[a-zA-Z]+>).*(?=</[a-zA-Z]+>)

  进一步的,我们发现前后两个断言中都有[a-zA-Z]+,可以使用分组来避免书写重复的内容:(?<=<([a-zA-Z]+)>).*(?=</\1>),当然也可以使用命名分组,这里就不展开了。

  说到这里,我归纳出了几句书写断言的口诀:

    前面有,正向后发(?<=exp),放前面;

    后面有,正向先行(?=exp),放后面;

    前面无,反向后发(?<!exp),放前面;

    后面无,反向先行(?!exp),放后面。

  请记住,这个前面和后面是针对目标字符串,也就是你要提取出来的字符串而言的。

4、实战:

  4.1、正向先行(?=exp):获取字符串中以ing结尾的字符:

  

  4.2、正向后发(?<=exp):获取字符串中以do开头的单词后半部分:

  

  4.3、反向先行(?!exp):匹配出字符串中不是以ing结尾的单词:

  

  此处有雷,如果字符串变成“do  run going hing”你再试试看,此处有待解决。

  4.4、反向后发(?<!exp):匹配字符串中不以do开头的单词:

  

  此处有雷,同上

  总结:主要原因是因为反向断言不支持匹配不定长的表达式;

  4.5、正向先行后发断言结合应用:字符串时ip地址,获取整数部分

  

  

Python正则表达式进阶-零宽断言的更多相关文章

  1. python 正则表达式之零宽断言

    零宽断言:用于查找特定内容之前或之后的内容,但并不包括特定内容本身.对于零宽断言来说,我认为最重要的一个概念是位置,零宽断言用于指定一个位置,这个位置应该满足一定的条件(它附近满足什么表达式),并且这 ...

  2. grep正则表达的零宽断言

    先看一组神奇的命令 [root@elastix82 tmp]# echo $html111<td>aaa</td>222[root@elastix82 tmp]# [root@ ...

  3. $python正则表达式系列(5)——零宽断言

    本文主要总结了python正则零宽断言(zero-length-assertion)的一些常用用法. 1. 什么是零宽断言 有时候在使用正则表达式做匹配的时候,我们希望匹配一个字符串,这个字符串的前面 ...

  4. Python爬虫学习(4): python中re模块中的向后引用以及零宽断言

    使用小括号的时候,还有很多特定用途的语法.下面列出了最常用的一些: 表4.常用分组语法 分类 代码/语法 说明 捕获 (exp) 匹配exp,并捕获文本到自动命名的组里 (?<name>e ...

  5. 从零宽断言说起到用python匹配html标签内容

    版权声明:本文为博主原创文章,转载请附带原文网址http://www.cnblogs.com/wbchanblog/p/7411750.html ,谢谢! 提示:本文主要是讲解零宽断言,所以阅读本文需 ...

  6. 正则表达式零宽断言详解(?=,?<=,?!,?<!)

    在使用正则表达式时,有时我们需要捕获的内容前后必须是特定内容,但又不捕获这些特定内容的时候,零宽断言就起到作用了 正则表达式零宽断言: 零宽断言是正则表达式中的难点,所以重点从匹配原理方面进行分析.零 ...

  7. crawler_正则表达式零宽断言

    在使用正则表达式时,有时我们需要捕获的内容前后必须是特定内容,但又不捕获这些特定内容的时候,零宽断言就起到作用了. (?=exp):零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp. ...

  8. python中的re模块中的向后引用和零宽断言

    1.后向引用 pattern = re.compile(r"(\w+)")#['hello', 'go', 'go', 'hello'] # pattern = re.compil ...

  9. Python-正则零宽断言及命名捕获(类PHP)

    (一)零宽断言 说明:本文的例子使用python描述      首先说明一下什么是零宽断言,所谓零宽断言就是并不去真正的匹配字符串文本,而仅仅是匹配对应的位置.      正则表达式中有很多这样的断言 ...

随机推荐

  1. 辨异 —— 行星 vs 恒星

    star:恒星,planet:行星: 1. 恒星 恒星是指宇宙中靠核聚变产生的能量而自身能发热发光的星体(比如太阳).过去天文学家以为恒星的位置是永恒不变的,以此为名.但事实上,恒星也会按照一定的轨迹 ...

  2. 一个简易版的Function.prototype.bind实现

    重新看<JavaScript设计模式与开发实践>一书,第32页发现个简易版的Function.prototype.bind实现,非常容易理解,记录在这了. Function.prototy ...

  3. Acdreamoj1116(Gao the string!)弦hash+二分法+矩阵高速功率

    Problem Description give you a string, please output the result of the following function mod 100000 ...

  4. 《Java并发编程实战》第十二章 测试并发程序 读书笔记

    并发测试分为两类:安全性测试(无论错误的行为不会发生)而活性测试(会发生). 安全測试 - 通常採用測试不变性条件的形式,即推断某个类的行为是否与其它规范保持一致. 活跃性測试 - 包含进展測试和无进 ...

  5. WPF 3D Transparency Depth-Order Sorting

    原文:WPF 3D Transparency Depth-Order Sorting   Just a quick post here - When making WPF 3D apps, trans ...

  6. uva 11346 - Probability(可能性)

    题目链接:uva 11346 - Probability 题目大意:给定x,y的范围.以及s,问说在该范围内选取一点,和x,y轴形成图形的面积大于s的概率. 解题思路:首先达到方程xy ≥ s.即y ...

  7. 细数Windows 的那些小技巧!

    以下整理自知乎 Windows 有哪些你相见恨晚的技巧?和Quora(英文版) What are some secret tricks you should know about Windows? 等 ...

  8. 关于 Swift 中的 Array.contains 方法

    Swift 2.0 中对语言进行了又一次的改进,这次将整个语言变得更加面向对象化,比如在 Swift 1.x 中如果要判断某个元素是否在数组中,就需要用到 contains 函数: if contai ...

  9. Vmware 占用宿主机硬盘空间只增不减

    问题: vmware 占用硬盘空间只增大不减少.即使你删除虚拟机系统里面的文件,占用宿主机的硬盘空间也不释放.用了一段时间后空间不够了. 解决办法: 方法一: 把一部分*sxxx.vmdk文件剪切到其 ...

  10. 从一段简单算法题来谈二叉查找树(BST)的基础算法

    先给出一道很简单,喜闻乐见的二叉树算法题: 给出一个二叉查找树和一个目标值,如果其中有两个元素的和等于目标值则返回真,否则返回假. 例如: Input: 5 / \ 3 6 / \ \ 2 4 7 T ...