正则表达式否定环视

时间:2019-09-27 15:55:46

标签: python regex regex-lookarounds regex-negation

我正在尝试使用以下正则表达式进行关键字匹配

you.{0,50}(?<!not)\s?special

在以下字符串列表中

to include:
youaresospecial
you are so special
you are pretty special
you are special
youarespecial
you are sospecial
you are very special
you are super special
you are special
you special
you aresospecial

to exclude:
youarenotspecial
you are not special
youarenotspecial

它与我需要包含的所有字符串匹配,但是它也突出显示了我要排除的字符串之一(“您并不特殊”)

已在https://regex101.com/r/KTsjn8/1

上对此进行了测试

有人可以指出原因吗?

2 个答案:

答案 0 :(得分:0)

您的正则表达式不起作用,因为\s?允许模式匹配special后面的零宽度位置,然后成功断言该位置后面没有not并带有{ {1}}。

您将不得不在断言后面进行两个否定的回溯声明,一个带有空格,另一个不带空格:

(?<!not)

演示:https://regex101.com/r/KTsjn8/2

答案 1 :(得分:0)

解释正则表达式失败的原因:

you are not special

  • you.{0,50}you are not 匹配(请注意空格)
  • (?<!not)之所以匹配,是因为not 不是not
  • \s?之所以匹配,是因为它是可选的
  • special匹配。

要解决此问题,您可以改用否定的前瞻:

you(?!.*not\s?special).{0,50}special