regex 大括号内内容的正则表达式

fafcakar  于 2023-10-22  发布在  其他
关注(0)|答案(4)|浏览(148)

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

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

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

bzzcjhmw

bzzcjhmw1#

在经典的正则表达式中,这是不可能的-DFA不能解析嵌套对。
有一些方法可以用扩展正则表达式来实现,比如一些正则表达式引擎(比如Perl正则表达式)中允许的递归表达式,但它们并不总是很漂亮。(too much php 提供了Perl版本:/\{(?:[^{}]+|(?R))*\}/,其中(?R)选项是递归匹配。)
你不一定需要regex来做这种事情。你可以通过遍历列表并保留一堆开括号(以及它们在什么位置被看到)来完成。然后,每当你看到一个左大括号时,你就把它的位置推到堆栈上,每当你看到一个右大括号时,你就把最近看到的左大括号弹出堆栈,并使用它的位置加上当前位置作为一个子字符串的边界,这个子字符串将成为你的匹配之一。重复直到你到达绳子的末端。

8iwquhpp

8iwquhpp2#

这很简单,但它找到了一个匹配:)

{'key': {'\w+': \[[\w,]*\w\]}}
ars1skjm

ars1skjm3#

正则表达式不能处理嵌套,因此没有在一般情况下工作的正则表达式。
如果可以限制最大嵌套深度,那么就可以构造一个表达式来显式检查所有可能的嵌套级别。一般来说,使用某种解析器框架可能会更好。

hkmswyz6

hkmswyz64#

PCRE regex库可以使用递归来实现:

/\{(?:[^{}]+|(?R))*\}/

相关问题