【问题标题】: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】:
其实这真的不是递归数据结构,注意a 和d 在不同的列表中。您只是将字符串拆分为括号字符并去掉一些空格。
我相信有人能找到更干净的东西,但如果你想要一个像下面这样的单线,应该会让你接近:
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']
【解决方案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
当然,这可能会得到改进,它会创建字符串列表的列表列表,这并不是您的示例想要的。但是,它确实可以处理任意深度的树。