[英]Tokenizing blocks of code in Python
我有這個字符串:
[a [a b] [c e f] d]
我想要一個這樣的清單
lst[0] = "a"
lst[1] = "a b"
lst[2] = "c e f"
lst[3] = "d"
我目前認為不是優雅/ pythonic的實現是兩個遞歸函數(一個用'['拆分,另一個用']'拆分),但我確信可以使用列表推導或正則表達式來實現(但我可以找不到解決問題的明智方法)。
有任何想法嗎?
實際上,這實際上不是遞歸數據結構,請注意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']
好吧,如果它是遞歸數據結構,則將需要一個遞歸函數來干凈地瀏覽它。
但是Python確實有一個可能有用的令牌生成器庫: http : //docs.python.org/library/tokenize.html
如果它是遞歸的數據結構,那么遍歷它就很好。 但是 ,解析字符串以創建結構並不需要遞歸。 我會做的另一種方法是迭代:
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
當然,這可能會得到改進,它將創建字符串列表的列表,這不是您的示例想要的。 但是,它確實可以處理樹的任意深度。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.