是否有正则表达式来匹配大括号内的内容。例如,具有以下内容:
d = {'key': {'a': [1,2,3]}}
我想匹配 {'key':{'a':[1,2,3]}} 和 {'a':[1,2,3] } ,但不是 {'key':{'a':[1,2,3]}
答案 0 :(得分:4)
在经典正则表达式中,这是不可能的--DFA无法解析嵌套对。
有一些方法可以使用扩展的正则表达式,例如某些正则表达式引擎(例如Perl正则表达式)中允许的递归表达式,但它们并不总是很漂亮。 (太多的php 提供了Perl版本:/\{(?:[^{}]+|(?R))*\}/
,其中(?R)
选项是递归匹配。)
你不一定需要正则表达式来做这种事情。你可以简单地通过遍历列表并保持一堆开放的大括号(以及他们在什么位置看到)来做到这一点。然后每当你看到一个打开的大括号时,你将它的位置推到堆栈上,每当你看到一个紧密的大括号时,你会从堆栈中弹出最近看到的开放大括号,并使用它的位置加上当前位置作为子串的边界这成为你的比赛之一。重复,直到到达字符串的末尾。
答案 1 :(得分:1)
这很简单,但找到了匹配:)
{'key': {'\w+': \[[\w,]*\w\]}}
答案 2 :(得分:0)
正则表达式无法处理嵌套,因此没有正则表达式可以在一般情况下使用。
如果可以限制最大嵌套深度,则可以构造一个表达式,该表达式明确检查所有可能的嵌套级别。通常,您最好使用某种解析器框架。
答案 3 :(得分:0)
PCRE正则表达式库可以使用递归来执行此操作:
/\{(?:[^{}]+|(?R))*\}/