recursion模式在正则expression式

这与正则expression式非常相关, 以匹配外括号,但是,我特别想知道如何或是否有可能做这个正则expression式的recursion模式我还没有find一个使用这个策略的Python例子,所以认为这应该是一个有用的问题!

我见过 一些 说recursion模式可以用来匹配平衡括号,但没有使用Python的正则expression式包的例子(注:re 支持recursion模式,你需要使用正则expression式)。

一种说法是语法是b(?:m|(?R))*e其中:

b是什么开始的构造, m是什么可以发生在构造的中间, e是什么可以发生在结构的末尾


我想在下面提取括号的匹配:

 "{1, {2, 3}} {4, 5}" ["1, {2, 3}", "4, 5"] # desired 

请注意,对于支架,这很容易实现:

 re.findall(r"{([^{}]*)}", "{1, {2, 3}} {4, 5}") ['2, 3', '4, 5'] 

(在我的例子中,我使用的是finditer(通过匹配对象),请看这里 。)

所以我希望以下或者其他的一些变化可以起作用:

 regex.findall(r"{(:[^{}]*|?R)}", "{1, {2, 3}} {4, 5}") regex.findall(r"({(:[^{}]*|?R)})", "{1, {2, 3}} {4, 5}") regex.findall(r"({(:.*|(?R))*})", "{1, {2, 3}} {4, 5}") regex.findall(r"({(:.*)|(?R)*})", "{1, {2, 3}} {4, 5}") regex.findall(r"({(:[^{}])|(?R)})", "{1, {2, 3}} {4, 5}") 

但是我被[]或者error: too much backtracking困扰error: too much backtracking

是否有可能使用正则expression式的recursion提取匹配对象的外部圆括号?


显然,我有被击倒的危险:

  • 不要用正则expression式parsinghtml
  • 用pyparse做到这一点
  • 写一个适当的词法和分析器,例如使用层

我想强调这是关于如何使用recursion模式 (如果我的理解是正确的,将我们带到常规语言parsing之外,所以可能实际上是可能的!)。 如果能做到,这应该是一个更清洁的解决scheme。

模式是:

 {((?>[^{}]+|(?R))*)} 

你可以看到这个例子:

 regex.findall("{((?>[^{}]+|(?R))*)}", "{1, {2, 3}} {4, 5}") # ['1, {2, 3}', '4, 5'] 

说明:

m部分需要排除括号。 如果你想同时为[^{}]赋一个量词,并且在没有灾难性回溯问题的情况下重复这个组,那么就需要使用一个primefaces组。 更清楚的是,如果缺less最后一个大括号,正则expression式引擎会按primefaces组而不是逐个字符回溯primefaces组。 为了使这一点成为可能,你可以使得量词所有格如下: {((?>[^{}]+|(?R))*+)} (或{((?:[^{}]+|(?R))*+)}因为primefaces组没有用处)。

primefaces群(?>....)和占有量词?+*+++是同一特征的两面。 此function禁止正则expression式引擎在成为“primefaces”的字符组内回溯(不能在较小的部分分割)

基本的例子是以下两种总是失败的stringaaaaaaaaaab

 (?>a+)ab a++ab 

那是:

 regex.match("a++ab", "aaaaaaaaaab") regex.match("(?>a+)ab", "aaaaaaaaaab") 

使用(?:a+)a+正则expression式引擎(默认情况下)logging(预览)所有字符的所有回溯位置。 但是当你使用一个primefaces组或占有量词时,这些回溯位置不再被logging(组开始除外)。 所以当回溯机制发生时,最后的“a”字符不能被返回。 只有整个团队可以退款。

[编辑]:如果使用“展开”子模式来描述括号内的内容,可以用更高效的方式编写模式:

 {([^{}]*+(?:(?R)[^{}]*)*+)} 

我能用b(?:m|(?R))*e语法做这个没问题:

 {((?:[^{}]|(?R))*)} 

演示


我认为你所尝试的关键是重复不是继续进行,而是整个(?:m|(?R))组。 这是什么允许(?R)参考recursion。