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

时间:2017-12-29 15:55:01

标签: python regex python-3.x

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

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

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

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

方括号不能嵌套,例如在[[]]中,我们要匹配[[]

尽管由于\]表示转义括号,我们需要跳过这些。但必须接受\\]之类的模式。以下内容不匹配。

[\]
[\\\]
[abc\\\]

该规则最终会从[到第一个]之间的匹配,而\前面没有奇数re.compile(r'\[[^]\\]*(?:\\.[^]\\]*)*\]')

似乎负面的后视不起作用,因为它必须有固定的长度。

编辑:WiktorStribiżew提供了一个有趣的解决方案

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

修改:Rawing

的上述更简单版本
Timer timer = new Timer();
        timer.Interval = 60000;
                    timer.Elapsed += new ElapsedEventHandler((x,y) => {
                    //Do whatever you want
                    timer.Stop();
            });

1 个答案:

答案 0 :(得分:1)

您可以使用

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

请参阅regex demo

<强>详情

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

正则表达式遵循unroll-the-loop principle。根据输入,它可能会工作很多,甚至比非展开版本r'\[(?:\\.|[^]\\])*]'快10倍,这是基于无限量化的交替组,导致大量冗余的回溯步骤。

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

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

请参阅此正则表达式演示

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