在Python中对代码块进行标记

时间:2009-07-23 15:51:25

标签: python regex list-comprehension tokenize

我有这个字符串:

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

我想要一个像这样的列表

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

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

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

实际上这实际上不是递归数据结构,请注意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']

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

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

当然,这可能会得到改进,并且会创建字符串列表的列表列表,这与您的示例所需的不完全相同。但是,它确实处理树的任意深度。