如何在圆括号之间得到一个表达式

发布于 2021-01-29 19:08:40

假设我得到以下类型的字符串:

"(this is (haha) a string(()and it's sneaky)) ipsom (lorem) bla"

我想提取括号最顶层中包含的子字符串。即我想获取字符串:"this is (haha) a string(()and it's sneaky)""lorem"

有没有很好的pythonic方法可以做到这一点?正则表达式 显然
不适合完成此任务,但是也许有一种让xml解析器完成任务的方法吗?对于我的应用程序,我可以假设括号的格式正确,即不是(()(())之类的东西。

关注者
0
被浏览
169
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    这是堆栈的标准用例:按字符读取字符串,每当遇到左括号时,便将符号压入堆栈;如果遇到右圆括号,则从堆栈中弹出符号。

    由于您只有一种类型的括号,因此实际上不需要堆栈。相反,仅记住有多少个开放括号就足够了。

    另外,为了提取文本,我们还记得在第一级括号打开时部分从哪里开始,并在遇到匹配的结束括号时收集结果字符串。

    可能看起来像这样:

    string = "(this is (haha) a string(()and it's sneaky)) ipsom (lorem) bla"
    
    stack = 0
    startIndex = None
    results = []
    
    for i, c in enumerate(string):
        if c == '(':
            if stack == 0:
                startIndex = i + 1 # string to extract starts one index later
    
            # push to stack
            stack += 1
        elif c == ')':
            # pop stack
            stack -= 1
    
            if stack == 0:
                results.append(string[startIndex:i])
    
    print(results)
    # ["this is (haha) a string(()and it's sneaky)", 'lorem']
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看