在字符串中找到匹配的打开/关闭大括号索引

如何解决在字符串中找到匹配的打开/关闭大括号索引

我想要这样的字符串的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 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res