是否有正则表达式来匹配大括号内的内容。例如:
d = {'key': {'a': [1,2,3]}}
我想匹配 * key ':'a':[1,2,3]}}和[1,2,3]},但不是“key”:[1,2,3]}**
bzzcjhmw1#
在经典的正则表达式中,这是不可能的-DFA不能解析嵌套对。有一些方法可以用扩展正则表达式来实现,比如一些正则表达式引擎(比如Perl正则表达式)中允许的递归表达式,但它们并不总是很漂亮。(too much php 提供了Perl版本:/\{(?:[^{}]+|(?R))*\}/,其中(?R)选项是递归匹配。)你不一定需要regex来做这种事情。你可以通过遍历列表并保留一堆开括号(以及它们在什么位置被看到)来完成。然后,每当你看到一个左大括号时,你就把它的位置推到堆栈上,每当你看到一个右大括号时,你就把最近看到的左大括号弹出堆栈,并使用它的位置加上当前位置作为一个子字符串的边界,这个子字符串将成为你的匹配之一。重复直到你到达绳子的末端。
/\{(?:[^{}]+|(?R))*\}/
(?R)
8iwquhpp2#
这很简单,但它找到了一个匹配:)
{'key': {'\w+': \[[\w,]*\w\]}}
ars1skjm3#
正则表达式不能处理嵌套,因此没有在一般情况下工作的正则表达式。如果可以限制最大嵌套深度,那么就可以构造一个表达式来显式检查所有可能的嵌套级别。一般来说,使用某种解析器框架可能会更好。
hkmswyz64#
PCRE regex库可以使用递归来实现:
4条答案
按热度按时间bzzcjhmw1#
在经典的正则表达式中,这是不可能的-DFA不能解析嵌套对。
有一些方法可以用扩展正则表达式来实现,比如一些正则表达式引擎(比如Perl正则表达式)中允许的递归表达式,但它们并不总是很漂亮。(too much php 提供了Perl版本:
/\{(?:[^{}]+|(?R))*\}/
,其中(?R)
选项是递归匹配。)你不一定需要regex来做这种事情。你可以通过遍历列表并保留一堆开括号(以及它们在什么位置被看到)来完成。然后,每当你看到一个左大括号时,你就把它的位置推到堆栈上,每当你看到一个右大括号时,你就把最近看到的左大括号弹出堆栈,并使用它的位置加上当前位置作为一个子字符串的边界,这个子字符串将成为你的匹配之一。重复直到你到达绳子的末端。
8iwquhpp2#
这很简单,但它找到了一个匹配:)
ars1skjm3#
正则表达式不能处理嵌套,因此没有在一般情况下工作的正则表达式。
如果可以限制最大嵌套深度,那么就可以构造一个表达式来显式检查所有可能的嵌套级别。一般来说,使用某种解析器框架可能会更好。
hkmswyz64#
PCRE regex库可以使用递归来实现: