我是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
为什么第二个不匹配?
答案 0 :(得分:1)
第一种模式:
re.search('(\d*)(?<=a)(\.)', '1a.')
表示找到零个或多个数字,后跟一个点。在点之前,它有一个正 lookbehind ,它断言前一个字符是a
。在这种情况下,Python将匹配零位,后跟一个点。外观闪现真实,因为前面的角色实际上是a
。
然而,第二种模式:
re.search('(\d+)(?<=a)(\.)','1a.')
匹配一个或更多数字,跟随lookbehind和匹配点。在这种情况下,Python被强制匹配数字1
。但后来它的后视必定会失败。显然,如果匹配的最后一个字符是数字,则不能是字母a
。因此,在第二种情况下不可能匹配。即使我们要从第二个模式中删除(?<=a)
,它仍然会失败,因为我们没有考虑字母a
。