为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

吃鸡游戏 2023-05-16 14:40:46
我想要这样的字符串的 for 循环中相应大括号的索引,例如:"(foo(bar))"。起初我是这样做的,但它总是匹配最右/最左的大括号,因此它不适用于多个大括号:for item in string:    if item == "(":        matchingbraceindex = string.find(")", item)    elif item == ")":        matchingbraceindex = string.rfind("(", 0, item)然后我想数大括号,但我仍然得不到索引,只是在其他大括号中的位置,我想不出从中提取索引的方法。
查看完整描述

5 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

使用堆栈,在遍历字符串时跟踪所有对:


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, 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 result


if __name__ == "__main__":

    print(find_matching_paren("(foo(barbaz(a(fz()asdf))))", 4)) # => 24


查看完整回答
反对 回复 2023-05-16
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

堆栈是解决问题最简单的方法。下面的解决方案将为您提供每对大括号的开始和结束索引作为元组列表。


在 [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)]


查看完整回答
反对 回复 2023-05-16
?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

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)

我没有尝试代码,但我认为它会起作用。


查看完整回答
反对 回复 2023-05-16
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

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



查看完整回答
反对 回复 2023-05-16
?
繁星coding

TA贡献1797条经验 获得超4个赞

试试这个,如果我正确理解你的问题,这就是你想要的。在这里,我在字符串中搜索“(”和“)”后将值附加到字典中


string = "(foo(bar))"


print(string.find(")"))

num = string.count(")")

a = 0

b = 0

dict_ = {"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_)


查看完整回答
反对 回复 2023-05-16
  • 5 回答
  • 0 关注
  • 168 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信