这个问题与可变长度后看无关,因为它可能有一个没有负后视的解决方案。
在 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)
即可获得正确的值。