在字符串中查找匹配的左/右大括号索引

我想要这样的字符串的 for 循环中相应大括号的索引,例如:"(foo(bar))"。


起初我是这样做的,但它总是匹配最右/最左的大括号,因此它不适用于多个大括号:


for item in string:

    if item == "(":

        matchingbraceindex = string.find(")", item)


    elif item == ")":

        matchingbraceindex = string.rfind("(", 0, item)

然后我想数大括号,但我仍然得不到索引,只是在其他大括号中的位置,我想不出从中提取索引的方法。


吃鸡游戏
浏览 137回答 5
5回答

牧羊人nacy

使用堆栈,在遍历字符串时跟踪所有对: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 resultif __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, braces=None):    openers = braces or {"(": ")"}    closers = {v: k for k, 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 resultif __name__ == "__main__":    print(find_matching_paren("(foo(barbaz(a(fz()asdf))))", 4)) # => 24

慕哥9229398

堆栈是解决问题最简单的方法。下面的解决方案将为您提供每对大括号的开始和结束索引作为元组列表。在 [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]: pairsOut[39]: [(4, 8), (0, 9)]

海绵宝宝撒

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)我没有尝试代码,但我认为它会起作用。

扬帆大鱼

使用堆栈。推动左括号,直到遇到右括号,此时您已找到最里面的一对。从你的问题中不清楚你在寻找什么输出,所以我不能说如何处理这些字母。

繁星coding

试试这个,如果我正确理解你的问题,这就是你想要的。在这里,我在字符串中搜索“(”和“)”后将值附加到字典中string = "(foo(bar))"print(string.find(")"))num = string.count(")")a = 0b = 0dict_ = {"open": [], "close": []}a = string.find("(", a)dict_["open"].append(a)for _ in range(0, num):    a = string.find("(", a+1)    dict_["open"].append(a)    b = string.find(")", b+1)    dict_["close"].append(b)dict_["open"].pop(-1)print(dict_)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python