【问题标题】:Negative lookahead followed by spaces负前瞻后跟空格
【发布时间】:2021-07-05 09:12:07
【问题描述】:

我无法弄清楚反向否定查找。 假设我有一个文本

qwe  abc
qwe abc
abc

我想找出所有abc 后面没有出现在qwe 后面的,后面可能跟任意数量的空格。

(?<!qwe)\s*?(abc)

匹配一切。我认为它类似于“如果前面没有 qwe,则匹配任意数量的空格,后跟 abc

我也试过了

qwe|(abs) 

方法,但它对我不起作用。尽管对于我不希望匹配工作的情况,组是空的,但我真的不知道如何将它与 re.sub 函数(需要)一起使用。即使组为空,re.sub 也会替换字符串。

环境:python 3

【问题讨论】:

  • 您可以使用 regex 模块而不是 re (?&lt;!qwe\s*)abc 来执行此操作,并将 \s* 放在后面。否则,您可以将qwe\s*abc|(abc) 与捕获组一起使用。 regex101.com/r/JNzeGi/1
  • 你可以使用这个模块pypi.org/project/regex
  • 这将是一个可变长度的lookbehind,不支持。否则@Thefourthbird 是对的,(?&lt;!qwe\s*)abc 会成功。试图想出一个解决方法。
  • 另一种方法是regex101.com/r/JNzeGi/1
  • 这里stackoverflow.com/q/31564195/187808 @jonrsharpe 评论使用regex 模块(而不是re),所以你会有可变长度的lookbehind。然后(?&lt;!qwe\s*)abc 就可以工作了。

标签: python python-3.x regex


【解决方案1】:

您不需要在这里使用lookbehind。只需坚持允许动态长度断言的负前瞻:

^(?!.*qwe\s+abc).*abc

或使用单词边界来确保 qweabc 是完整的单词。

^(?!.*\bqwe\s+abc\b).*\babc\b

RegEx Demo

正则表达式解释:

  • ^:开始
  • (?!.*qwe\s+abc):如果我们在行中的任何位置找到qwe 后跟 1+ 空格后跟 abc,则负前瞻失败匹配
  • .*:匹配 0 个或多个任意字符
  • abc:匹配abc

【讨论】:

  • 我只想提一件事:据我所知,前瞻要求在实际前瞻之前匹配一些东西。例如。 (?
  • 请理解(?&lt;!...) 是向后看,(?!...) 是向前看。我在回答中建议的是lookahead。我建议this very good tutorial on look-arounds
【解决方案2】:

您可以在“The Best Regex Trick”here 上找到一篇有趣的文章,在该文章中,您首先必须使用替换来匹配您想要的内容。然后在一个捕获组中捕获你想要的。

语法为:MatchWhatYouDon'tWant|(MatchWhatYouDoWant)。在您的特定情况下,我们可以使用一些额外的语法,使用单词边界和非捕获组来嵌套交替:

\b(?:qwe\b\s+abc|(abc))\b

在线查看demo

  • \b - 字边界。
  • (?: - 打开非捕获组:
    • qwe\b\s+abc - 匹配“qwe”字面后跟一个单词边界、1+ 个空格字符和“abc”。
    • | - 或者:
    • (abc) - 在第一个捕获组中匹配“abc”。
    • ) - 关闭非捕获组。
  • \b - 字边界。

【讨论】:

    【解决方案3】:

    对于所有 3 个示例,您在第 1 组中匹配 abc 的原因是,您的模式 (?&lt;!qwe)\s*?(abc) 在当前位置断言直接位于左侧的不是 qwe,然后匹配可选的空白字符。

    对于qwe 后面的空格后位置的前两个示例,此断言是正确的。模式可以移动到断言为真的位置,因为它可以匹配一个空白字符,使断言在该位置为真。

    第三个例子得到一个匹配,因为左边没有qwe

    注意,例如,qweabc 将不匹配,因为没有空间可以匹配空白字符,从而使断言为真。


    re 不支持可变长度的lookbehinds,但PyPi regex 模块支持。

    (?<!qwe\s*)abc
    
    • (?&lt;!qwe\s*) 肯定的后视断言直接在左边不是 qwe 后跟可选的空白字符。
    • abc 逐字匹配(您不再需要组)

    Regex demo | Python demo

    【讨论】:

      猜你喜欢
      • 2021-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      相关资源
      最近更新 更多