2

是否有正则表达式来匹配大括号内的内容。例如以下内容:

d = {'key': {'a': [1,2,3]}}

我想匹配{'key': {'a': [1,2,3]}}{'a': [1,2,3]},但不是{'key': {'a' :[1,2,3]}

4

4 回答 4

4

在经典的正则表达式中,这是不可能的——DFA 无法解析嵌套对。

有一些方法可以使用扩展的正则表达式来做到这一点,例如某些正则表达式引擎(例如 Perl 正则表达式)中允许的递归表达式,但它们并不总是很漂亮。(太多的 php/\{(?:[^{}]+|(?R))*\}/提供了Perl 版本:(?R)选项是递归匹配。)

不过,您不一定需要正则表达式来做这种事情。您可以简单地通过遍历列表并保留一堆打开的大括号(以及它们出现在什么位置)来做到这一点。然后每当你看到一个左大括号,你将它的位置压入堆栈,每当你看到一个右大括号,你从堆栈中弹出最近看到的左大括号,并使用它的位置加上当前位置作为子字符串的边界这成为你的比赛之一。重复直到到达字符串的末尾。

于 2009-09-16T00:53:53.830 回答
1

这相当简单,但它找到了一个匹配项:)

{'key': {'\w+': \[[\w,]*\w\]}}
于 2009-09-16T01:05:32.120 回答
0

正则表达式无法处理嵌套,因此没有正则表达式适用于一般情况。

如果您可以限制最大嵌套深度,您可能可以构造一个表达式来显式检查所有可能的嵌套级别。通常,您最好使用某种解析器框架。

于 2009-09-16T00:56:38.593 回答
0

PCRE 正则表达式库可以使用递归来做到这一点:

/\{(?:[^{}]+|(?R))*\}/
于 2009-09-16T01:00:24.537 回答