为什么这种环顾正则表达式返回意外结果?

时间:2019-02-22 21:46:04

标签: python regex python-regex

txt = "r/1 /r/2 er/3"
x = re.findall("(?!e)r\/[0-9]", txt)

上面的代码匹配r/1r/2r/3(即所有内容)

将其更改为?=e时不匹配

不是第一个代码应该只匹配r/1 and r/2,因为我基本上是说“匹配模式r/digit,但前提是它前面没有e

1 个答案:

答案 0 :(得分:2)

如果(?!e)是否定型外观 ,如果当前位置右侧的图案立即找到匹配项,则匹配失败。因此,(?!e)r总是匹配,因为r不是e,并且(?!e)r\/[0-9] = r\/[0-9](即前瞻是多余的,因为它不会影响匹配过程)

您想要一个negative lookbehind(?<!e)

(?<!e)r/[0-9]+

请参见regex demo。我还建议量化[0-9]模式以匹配1个或多个数字。

详细信息

  • (?<!e)-向后隐藏,可确保当前位置的左侧没有e
  • r/-一个r/子字符串
  • [0-9]+-1个以上的数字。