簡體   English   中英

在Python中標記代碼塊

[英]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的實現是兩個遞歸函數(一個用'['拆分,另一個用']'拆分),但我確信可以使用列表推導或正則表達式來實現(但我可以找不到解決問題的明智方法)。

有任何想法嗎?

實際上,這實際上不是遞歸數據結構,請注意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']

好吧,如果它是遞歸數據結構,則將需要一個遞歸函數來干凈地瀏覽它。

但是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM