这与正则表达式匹配外括号非常相关,但是,我特别想知道如何或是否可以执行此正则表达式的递归模式?我还没有找到使用这种策略的 python 示例,所以认为这应该是一个有用的问题!
我已经看到 一些 声称 可以使用递归模式来匹配平衡括号,但没有使用 python 的regex包的示例(注意:re不支持递归模式,您需要使用 regex)。
一种说法是语法是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
.
是否可以使用正则表达式的递归提取外括号的匹配对象?
显然,我冒着被击落的风险:
- 不要用正则表达式解析 html
- 用 pyparse 做这个
- 编写适当的词法分析器和解析器,例如使用 ply
我想强调这是关于如何使用递归模式(如果我的理解是正确的,它会将我们带到常规语言解析之外,所以实际上可能是可能的!)。如果可以做到,这应该是一个更清洁的解决方案。