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。