2016-09-17 155 views
3

我試圖找到方法來解析字符串,可以包含變量,函數,列表或字典用python語法編寫,用「,」分隔。空格應該可以在任何地方使用,所以當它不在inside(),[]或{}中時,用「,」分隔。Python解析字符串包含函數,列表和字典

例字符串:"variable, function1(1,3), function2([1,3],2), ['list_item_1','list_item_2'],{'dict_key_1': "dict_item_1"}"

又如字符串:"variable,function1(1, 3) , function2([1,3],2), ['list_item_1','list_item_2'],{'dict_key_1': "dict_item_1"}"

實施例輸出["variable", "function1(1,3)", "function2([1,3],2)", "['list_item_1','list_item_2']", "{'dict_key_1': "dict_item_1"}"]

編輯: 原因代碼是解析的串,然後用exec("var = &s" % list[x])運行它。 (是的,我知道這可能不是推薦的方式做東西)

回答

0

正則表達式對解析任意代碼的複雜性不是很好。你究竟想要完成什麼?您可以(不安全地)使用eval來將字符串評估爲代碼。或者,如果您試圖瞭解它,則可以使用the astdis modules進行各種形式的檢查。

+0

代碼的原因是將字符串解析到列表中,然後使用exec(var = list [x])運行它。 – SacredCoconut

+0

@SacredCoconut:是否有理由不一次批量解析它? – ShadowRanger

+0

對不起,我不知道你的意思是批量解析。 – SacredCoconut

0

你試過使用拆分?

>>> teststring = "variable, function1(1,3), function2([1,3],2), ['list_item_1','list_item_2'],{'dict_key_1': 'dict_item_1'}" 
>>> teststring.split(", ") 
['variable', 'function1(1,3)', 'function2([1,3],2)', "['list_item_1','list_item_2'],{'dict_key_1': 'dict_item_1'}"] 
+0

哦,是的,我忘了提及它可能會或可能沒有「,」後面的空格。例如「['variable',function1(1,3)'」不起作用。 – SacredCoconut

2

我想這裏的主要問題是數組和字典中也有逗號,所以只使用str.split(",")將無法​​工作。一種做法是一次解析字符串中的一個字符,並跟蹤所有括號是否關閉。如果是,我們可以在遇到逗號時將當前結果附加到數組。這是我的嘗試:

s = "variable, function1(1,3),function2([1,3],2),['list_item_1','list_item_2'],{'dict_key_1': 'dict_item_1'}" 

tokens = [] 
current = "" 
open_brackets = 0 

for char in s: 
    current += char 

    if char in "({[": 
     open_brackets += 1 
    elif char in ")}]": 
     open_brackets -= 1 
    elif (char == ",") and (open_brackets == 0): 
     tokens.append(current[:-1].strip()) 
     current = "" 

tokens.append(current) 

for t in tokens: 
    print(t) 

""" 
    variable 
    function1(1,3) 
    function2([1,3],2) 
    ['list_item_1','list_item_2'] 
    {'dict_key_1': 'dict_item_1'} 
""" 
+0

我正在考慮使用'list'作爲一個括號棧,但'open_brackets'計數器的工作原理相同並且更簡單。 – chapelo

+0

是的,我只是認爲正則表達式/ python會有辦法做到這一點,而不是寫我自己的算法。我想,我必須這樣做。 – SacredCoconut