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