【问题标题】:Tokenizing blocks of code in Python在 Python 中标记代码块
【发布时间】:2009-07-23 15:51:24
【问题描述】:

我有这个字符串:

[a [a b] [c e f] d]

我想要一个这样的列表

lst[0] = "a"
lst[1] = "a b"
lst[2] = "c e f"
lst[3] = "d"

我认为不是优雅/pythonic 的当前实现是两个递归函数(一个与 '[' 另一个带有 ']' )但我相信它可以 使用列表推导或正则表达式完成(但我想不出一种理智的方法)。

有什么想法吗?

【问题讨论】:

    标签: python regex list-comprehension tokenize


    【解决方案1】:

    其实这真的不是递归数据结构,注意ad 在不同的列表中。您只是将字符串拆分为括号字符并去掉一些空格。

    我相信有人能找到更干净的东西,但如果你想要一个像下面这样的单线,应该会让你接近:

    parse_str = '[a [a b] [c e f] d]'
    lst = [s.strip() for s in re.split('[\[\]]', parse_str) if s.strip()]
    
    >>>lst
    ['a', 'a b', 'c e f', 'd']
    

    【讨论】:

      【解决方案2】:

      好吧,如果它是一个递归数据结构,您将需要一个递归函数来清晰地导航它。

      但 Python 确实有一个可能有用的标记器库: http://docs.python.org/library/tokenize.html

      【讨论】:

        【解决方案3】:

        如果它是一个递归数据结构,那么递归是很好的遍历它。 然而,解析字符串来创建结构不需要递归。我会这样做的另一种方法是迭代:

        origString = "[a [a b] [c [x z] d e] f]".split(" ")
        stack = []
        for element in origString:
            if element[0] == "[":
                newLevel = [ element[1:] ]
                stack.append(newLevel)
            elif element[-1] == "]":
                stack[-1].append(element[0:-1])
                finished = stack.pop()
                if len(stack) != 0:
                    stack[-1].append(finished)
                else:
                    root = finished
            else:
                stack[-1].append(element)
        print root
        

        当然,这可能会得到改进,它会创建字符串列表的列表列表,这并不是您的示例想要的。但是,它确实可以处理任意深度的树。

        【讨论】:

          猜你喜欢
          • 2021-11-29
          • 2018-06-30
          • 1970-01-01
          • 1970-01-01
          • 2014-10-04
          • 1970-01-01
          • 1970-01-01
          • 2016-06-04
          • 2017-08-29
          相关资源
          最近更新 更多