【问题标题】:Regex match character only when NOT preceeded by specific word正则表达式仅在不以特定单词开头时匹配字符
【发布时间】:2020-06-03 21:21:05
【问题描述】:

目标是让正则表达式匹配所有前面没有 2 位十进制数字的换行符。这是一些示例文本:

This line ends with text
this line ends with a number: 55
this line ends with a 2-decimal number: 5.00
here's 22.22, not at the end of the line

Regex 应该匹配第 1、2 和 4 行的结尾(假设第 4 行之后有一个换行符)。我认为否定前瞻是答案,所以我尝试了

(?!\d*\.\d\d)\n

在这个 regex101 sn-p 中看到没有成功:https://regex101.com/r/qbrKlt/4

编辑:我后来发现这不起作用的原因是因为 Python 的 Regex 不支持可变长度的负前瞻 - 它只支持固定长度的负前瞻。

不幸的是,固定长度的前瞻仍然不起作用:

(?!\.\d\d)\n

相反,我通过运行正则表达式两次并减去结果来解决问题:

  1. 查找换行符的所有索引:\n
  2. 查找所有以 2 位小数开头的换行符索引:\d*\.\d\d\n
  3. 从第 1 步中找到的索引中删除第 2 步中找到的索引以获得答案

但我确信有一种方法可以一次性做到这一点,我会感谢任何可以帮助发现解决方案的人:)

【问题讨论】:

  • 为什么要匹配第二行?
  • Python 的正则表达式不支持可变长度的负前瞻 - 错误,re 支持可变宽度的前瞻。它不支持未知宽度的 lookbehind 模式。
  • 不正确的欺骗:这个问题不仅仅是关于使用lookbehind,而是关于在python中处理一个非常具体的未知宽度lookbehind模式的案例。

标签: python regex regex-lookarounds regex-negation


【解决方案1】:

当您可以使用 string.split()[-1] 捕获最终单词并测试您需要的形式时,为什么要使用正则表达式变得深奥? Python 不是 Perl(幸运的是)。

【讨论】:

    【解决方案2】:

    您需要使用否定的lookbehind而不是否定的lookahead:

    (?<!\.\d\d)\n
    

    Updated RegEx Demo

    这将匹配\n,如果它的前面不是点和 2 位数字。

    【讨论】:

      猜你喜欢
      • 2010-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-10
      • 2015-06-24
      • 1970-01-01
      相关资源
      最近更新 更多