如何解决在字符串中找到匹配的打开/关闭大括号索引
我想要这样的字符串的for循环中相应括号的索引,例如://does all the boilerplate opengl setup.
setup!{
// setting my variables and settings
}
// // adds a loop around the code in it and keeps up the framerate etc
draw!{
// do my updating and drawing commands
}
。
起初我是这样做的,但它总是与最右/最左的括号匹配,因此不适用于多个括号:
"(foo(bar))"
然后我想到了要计算大括号,但我仍然无法获得索引,只能得到其他大括号中的位置,我想不出从中提取索引的方法。
解决方法
使用堆栈。推左括号,直到遇到右括号,这时您已找到最里面的一对。从您的问题中不清楚您正在寻找什么输出,所以我无法说出如何处理这些字母。
,indexes_of_opening_brackets = []
indexes_of_closing_brackets = []
for index,item in enumerate(string):
if item == "(":
indexes_of_opening_brackets.append(index)
elif item == ")":
indexes_of_closing_brackets.append(index)
我没有尝试过代码,但是我认为它可以工作。
,尝试这个,如果我正确理解了您的问题,这就是您想要的。 在这里,我在字符串中搜索“(”和“)”后将值附加到字典中
202112
,
堆栈是解决问题的最简单方法。以下解决方案将为您提供每对大括号的开始和结束索引,作为元组列表。
在[37]中:string ='(foo(bar))'
In [38]: braces_stack = []
...:
...: pairs = []
...:
...: for index,char in enumerate(string):
...: if char=='(':
...: braces_stack.append(index)
...: elif char==')':
...: idx = braces_stack.pop()
...: pairs.append((idx,index))
...:
...:
In [39]: pairs
Out[39]: [(4,8),(0,9)]
,
使用堆栈,在遍历字符串时跟踪所有对:
def find_matching_parens(s,braces=None):
openers = braces or {"(": ")"}
closers = {v: k for k,v in openers.items()}
stack = []
result = []
for i,c in enumerate(s):
if c in openers:
stack.append([c,i])
elif c in closers:
if not stack:
raise ValueError(f"tried to close brace without an open at position {i}")
pair,idx = stack.pop()
result.append([idx,i])
if pair != closers[c]:
raise ValueError(f"mismatched brace at position {i}")
if stack:
raise ValueError(f"no closing brace at position {i}")
return result
if __name__ == "__main__":
print(find_matching_parens("(foo(bar)()baz(a(fz()asdf)))"))
输出:
[[4,8],[9,10],[19,20],[16,25],[14,26],[0,27]]
如果只想为特定索引使用匹配的括号,则可以对上述功能使用此修改:
def find_matching_paren(s,i,v in openers.items()}
stack = []
result = []
if s[i] not in openers:
raise ValueError(f"char at index {i} was not an opening brace")
for ii in range(i,len(s)):
c = s[ii]
if c in openers:
stack.append([c,ii])
elif c in closers:
if not stack:
raise ValueError(f"tried to close brace without an open at position {i}")
pair,idx = stack.pop()
if pair != closers[c]:
raise ValueError(f"mismatched brace at position {i}")
if idx == i:
return ii
if stack:
raise ValueError(f"no closing brace at position {i}")
return result
if __name__ == "__main__":
print(find_matching_paren("(foo(barbaz(a(fz()asdf))))",4)) # => 24
,
使用正则表达式(source)
import re
[m.start() for m in re.finditer('\(','(foo(bar))')]
[0,4]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。