正则表达式先行断言

时间:2017-12-31 14:39:15

标签: python regex

我是python正则表达式的新手,正在学习前瞻性断言。

我发现以下奇怪的事。有人能告诉我它是如何工作的吗?

import regex as re
re.search('(\d*)(?<=a)(\.)','1a.')
<regex.Match object; span=(2, 3), match='.'>

re.search('(\d+)(?<=a)(\.)','1a.')
out put nothing

为什么第二个不匹配?

1 个答案:

答案 0 :(得分:1)

第一种模式:

re.search('(\d*)(?<=a)(\.)', '1a.')

表示找到零个或多个数字,后跟一个点。在点之前,它有一个正 lookbehind ,它断言前一个字符是a。在这种情况下,Python将匹配零位,后跟一个点。外观闪现真实,因为前面的角色实际上是a

然而,第二种模式:

re.search('(\d+)(?<=a)(\.)','1a.')

匹配一个或更多数字,跟随lookbehind和匹配点。在这种情况下,Python被强制匹配数字1。但后来它的后视必定会失败。显然,如果匹配的最后一个字符是数字,则不能是字母a。因此,在第二种情况下不可能匹配。即使我们要从第二个模式中删除(?<=a),它仍然会失败,因为我们没有考虑字母a