我看过一些关于使用递归模式可以匹配平衡括号的声明和主张,但没有使用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
我想强调这是关于如何使用递归模式(如果我的理解正确,这将带我们走出常规语言解析,因此实际上可能是可行的!)。如果可以做到,这应该是一个更简洁的解决方案。
(?R)
和b(?:m|(?R))*e
是一个很棒的技巧,我以前从没看过这么明确的解释 :) - Sam