如果我有一个字符串:
s = aaa{bbb}ccc{ddd{eee}fff}ggg
是否可以根据外部花括号找到所有匹配项?
m = re.findall(r'\{.+?\}', s, re.DOTALL)
返回
['{bbb}', '{ddd{eee}']
但我需要:
['{bbb}', '{ddd{eee}fff}']
是否可以使用python正则表达式?
答案 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)
答案 2 :(得分:1)
你也可以使用这个正则表达式。
\{(?:{[^{}]*}|[^{}])*}
>>> 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
模块会支持这一点。