正则表达式中的断言(assertions)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式中的断言(assertions)相关的知识,希望对你有一定的参考价值。

参考技术A 广义上理解,断言(assertions),从字面上理解就是,判定 是 ,还是 否 。在正则表达式的系统里,也就是 匹配 或者 不匹配 。随便写一个正则表达式,都能产生 匹配 或者 不匹配 的结果,所以,可以这样说,所有的正则表达式都可以叫断言。
有时候,我们也经常会看到看到这个概念,零宽断言(zero-width assertions)。普通的断言,比如 \d+ (匹配一个或者多个数字),它所匹配的内容是由长度的;而有些断言比如 ^ 和 $ (分别匹配行开头和结尾)匹配的仅仅是一个位置,这样可以理解为它所匹配的内容长度为0。所以,称这类断言为零宽断言(zero-width assertions)。

然而,实际中,好多时候,提到断言,都是指零宽断言( Regular Expressions Explained )。(可以这样简单地理解:其它的断言比较简单,没有什么好说的。。。)所以,有时候,会看到下面的概念:

下面是断言的一个解释:

正则表达式中右两类断言:Anchors和Lookarounds。

Anchors, or atomic zero-width assertions, cause a match to succeed or fail depending on the current position in the string, but they do not cause the engine to advance through the string or consume characters. The metacharacters listed in the following table are anchors.

From: Anchors in Regular Expressions

这里以IDEA为例,举例说明断言的使用。
在IDEA中新建一个 text.txt 文本文件,然后输入如下测试文本:

匹配前面紧跟着“al”的“in”,可以用正则表达式:

效果如下:

匹配后面是“in”的“al”,可以用正则表达式:

效果如下:

匹配前面没有紧跟着“al”的“in”,可以用正则表达式:

效果如下:

匹配后面不是“in”的“al”,可以用正则表达式:

效果如下:

同时使用前向和后向断言可以实现对匹配内容两侧的控制。
匹配后面是”f“前面是”al“的”in“,可以用正则表达式:

效果如下:

匹配后面不是”fin“前面是”ly“的”al“,可以用正则表达式:

效果如下:

比如我们有如下的xml文档:

(1) 匹配搜索每条item的内容
现在我们想匹配搜索出每条item的内容,可以采用如下的正则表达式:

效果如下图:

在上面的正则表达式中可以看出有写 1,200 。实际上,这里只是用来取代 + (相当于 1, ,出现1次或者一次以上)。由于这些模式是出现在后向断言的模式(出现在匹配内容的左侧)中,所以不能包含不限定上限次数的模式(可能和具体正则表达式的实现有关系),由于这里不可能高于200次,所以这里用它来取代次数无上限。
这有什么用呢?上图中的红框可以让IDEA选中所有的匹配,这时候,只需要复制粘贴,就可以将所有匹配到的内容一次性全部摘出来。效果如下:

(2) 匹配所有Event的class
现在想匹配所有Event的class,可以使用如下的正则表达式:

这里由于用的是前向断言,所以,这里可以采用 + 这种不设次数上限的匹配模式。

使用否定前瞻断言匹配python中不以特定字符开头的单词的正则表达式[重复]

【中文标题】使用否定前瞻断言匹配python中不以特定字符开头的单词的正则表达式[重复]【英文标题】:Regular expression to match words which does not start with particular charector in python using negative lookahead assertion [duplicate] 【发布时间】:2018-12-11 02:23:03 【问题描述】:

在字符串中

s = 'Makeupby Antonia #makeup #makeupartist #makeupdolls #abhcosmetics'  

我只想匹配不以# 开头的单词。表示我只想选择 MakeupbyAntonia 我尝试使用否定前瞻断言

re.findall(r'\b(?![#])[a-zA-Z]+',s)  

['Makeupby',
 'Antonia',
 'makeup',
 'makeupartist',
 'makeupdolls',
 'abhcosmetics']

但这与所有单词匹配。我哪里错了?

【问题讨论】:

【参考方案1】:

(?!) 是否定前瞻的语法。你想要一个消极的回顾。

试试\b(?<!#)[a-zA-Z]+

Demo

【讨论】:

以上是关于正则表达式中的断言(assertions)的主要内容,如果未能解决你的问题,请参考以下文章

在 JUnit 中断言正则表达式匹配

正则表达式零宽断言

老男孩带你了解perl正则表达式中的零宽断言

老男孩带你了解perl正则表达式中的零宽断言

正则表达式(二):断言

Python 正则表达式零宽正负向断言的用法及示例代码