匹配表示正则表达式集的模式



这个问题与可变长度后看无关,因为它可能有一个没有负后视的解决方案。

在 Python3 中,我正在尝试匹配一种模式,该模式可能处于正则表达式所能达到的极限,但我仍然想尝试一下。我实际上是在尝试避免使用解析工具。

我想要匹配的是指示正则表达式集的模式。因此,以下内容将被匹配。

[abc]
[1-9nt]
[ t]]
[\]]
[[\\\]]

方括号不能嵌套,以[[]]为例,我们要匹配[[]

虽然,由于]表示转义括号,我们需要跳过这些括号。但像\]这样的模式必须被接受。以下内容将不匹配。

[]
[\]
[abc\]

该规则最终从[匹配到第一个],前面没有奇数

似乎负面的回头看不起作用,因为它必须具有固定的长度。

编辑:Wiktor Stribiżew给出了一个有趣的解决方案

re.compile(r'[[^]\]*(?:\.[^]\]*)*]')

编辑:Rawing的上述简化版本

r'[(?:\.|[^]\])*]'

您可以使用

re.compile(r'[[^]\]*(?:\.[^]\]*)*]', re.DOTALL)

请参阅正则表达式演示。

  • [-[
  • [^]\]*- 除]以外的 0 个或多个字符
  • (?:- 与以下序列匹配的非捕获组的开始:
    • \.- 一个字符,后跟任何字符
    • [^]\]*- 除]以外的 0 个或多个字符
  • )*- 非捕获组内模式的零次或多次重复
  • ]- 一个]字符。

正则表达式遵循展开循环原则。根据输入的不同,它的工作速度可能比非展开版本快 10+ 倍,r'[(?:\.|[^]\])*]',这是基于无限量化的交替群,导致大量冗余回溯步骤。

请注意,当初始[前面带有反斜杠时,上面的正则表达式可能会失败。在这些情况下,您将需要

r'(?<!\)(?:\{2})*([[^]\]*(?:\.[^]\]*)*])'

查看此正则表达式演示

这里的主要区别是(?<!\)(?:\{2})*,一个(?<!\)的负回溯,如果当前位置前面有一个字符,则匹配失败,(?:\{2})*匹配两个文字反斜杠的 0+ 重复。模式的其余部分用捕获括号括起来,当找到匹配项时,您只需访问match.group(1)即可获得正确的值。

相关内容

  • 没有找到相关文章

最新更新