匹配花括号之间的内容也可以包含花括号

时间:2015-01-14 16:09:59

标签: python regex

如果我有一个字符串:

s = aaa{bbb}ccc{ddd{eee}fff}ggg

是否可以根据外部花括号找到所有匹配项?

m = re.findall(r'\{.+?\}', s, re.DOTALL)

返回

['{bbb}', '{ddd{eee}']

但我需要:

 ['{bbb}', '{ddd{eee}fff}']

是否可以使用python正则表达式?

3 个答案:

答案 0 :(得分:4)

如果你想让它在任何深度上工作,但不一定需要使用正则表达式,你可以实现一个简单的基于堆栈的自动机:

s = "aaa{bbb}ccc{ddd{eee}fff}ggg"

def getStuffInBraces(text):
    stuff=""
    count=0
    for char in text:
        if char=="{":
            count += 1
        if count > 0:
            stuff += char
        if char=="}":
            count -= 1
        if count == 0 and stuff != "":
            yield stuff
            stuff=""

getStuffInBraces是一个迭代器,所以如果你想要一个结果列表,你可以使用print(list(getStuffInBraces(s)))

答案 1 :(得分:3)

{(?:[^{}]*{[^{]*})*[^{}]*}

试试这个。看看演示。

https://regex101.com/r/fA6wE2/28

P.S仅在{}深度不超过1水平时才有效。

答案 2 :(得分:1)

你也可以使用这个正则表达式。

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

DEMO

>>> s = 'aaa{bbb}ccc{ddd{eee}fff}ggg'
>>> re.findall(r'\{(?:{[^{}]*}|[^{}])*}', s)
['{bbb}', '{ddd{eee}fff}']

使用递归正则表达式1级深度。

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

代码:

>>> import regex
>>> regex.findall(r'\{(?:(?R)|[^{}])*}', s)
['{bbb}', '{ddd{eee}fff}']

但是外部regex模块会支持这一点。