当前位置: 首页 > 面试题库 >

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

安泰平
2023-03-14
问题内容

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

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

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

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


问题答案:

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

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

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

可能看起来像这样:

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']


 类似资料:
  • 我正在尝试找到一种方法,使VSCode在我点击括号内的回车键到括号的开头时自动缩进项目,如下所示(类似于这篇文章)。这在Jupyter中运行良好,但我在VSCode中找不到相同的解决方案,也无法在线找到解决方案。有人知道如何通过VSCode中的预设来实现这一点吗?提前致谢。 当前: 渴望的: 编辑 @Shradha 虽然听起来与我正在寻找的内容相似,但您的建议并没有以我正在寻找的方式解决代码问题。

  • 我正在尝试编写一个正则表达式模式,并使用split函数对所有句点进行拆分,除非这些句点位于开括号和闭括号或花括号之间。我想我是对的,因为在一个在线正则表达式测试程序中,当我运行拆分时,它正确地突出显示了我想要拆分的周期,它拆分的不仅仅是周期,还创建了一个长列表。我想我正在做一些明显的事情,但似乎无法理解。请看下面的内容。谢谢 到目前为止我所拥有的: Regex到目前为止: .(? =([^]]([

  • 如何使用JavaScript中的正则表达式从下面句子中两个圆括号之间检索单词? “这是(我的)简单文本”

  • 好的正则表达式问题,如何提取不在两个字符之间的字符,在本例中为括号。 我有一个字符串,例如:word1 |{word2 | word3}| word 4 我只想得到第一个和最后一个“管道”,而不是括号内的第二个。我尝试了无数次负克拉和负分组的尝试,但似乎无法让它发挥作用。 基本上,我在JavaScript拆分函数中使用这个正则表达式将其拆分为一个数组,其中包含:“word1”、“{word2|wo

  • 问题内容: 我需要的只是括号内的内容。 问题答案: 如果您的问题确实如此简单,则不需要正则表达式:

  • 问题内容: 我正在寻找一个正则表达式来匹配大括号之间的文本。 我希望将它们分别作为单独的组 。 我试过只删除第一个和最后一个大括号。 问题答案: 您需要围绕要捕获的内容使用捕获组。 只是为了匹配并捕获大括号之间的内容。 输出量 如果要三个特定的匹配组… 输出量