Python解析包含函数、列表和dict的字符串

Python解析包含函数、列表和dict的字符串,python,regex,string-parsing,Python,Regex,String Parsing,我试图找到解析字符串的方法,该字符串可以包含用python语法编写的变量、函数、列表或dict,并用“,”分隔。空格应该可以在任何地方使用,所以当它不在()内时,用“,”,[]或{}分隔 示例字符串:“变量,函数1(1,3),函数2([1,3],2),['list\u item\u 1','list\u item\u 2'],{'dict\u key\u 1':“dict\u item\u 1”}” 另一个示例字符串:“变量,function1(1,3),function2([1,3],2),[

我试图找到解析字符串的方法,该字符串可以包含用python语法编写的变量、函数、列表或dict,并用“,”分隔。空格应该可以在任何地方使用,所以当它不在()内时,用“,”,[]或{}分隔

示例字符串:
“变量,函数1(1,3),函数2([1,3],2),['list\u item\u 1','list\u item\u 2'],{'dict\u key\u 1':“dict\u item\u 1”}”

另一个示例字符串:
“变量,function1(1,3),function2([1,3],2),['list\u item\u 1','list\u item\u 2'],{'dict\u key\u 1':“dict\u item\u 1”}”

示例输出<代码>[“变量”,“函数1(1,3)”,“函数2([1,3],2)”,“[‘列表项_1’,‘列表项_2'],“{'dict_key_1':“dict_项_1”}”]

编辑:
代码的原因是解析字符串,然后使用
exec(“var=&s”%list[x])
运行它。(是的,我知道这可能不是推荐的方法)

您尝试过使用split吗

>>> 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'}"]

正则表达式不能很好地解析任意代码的复杂性。你到底想完成什么?您可以(不安全地)使用
eval
将字符串作为代码进行求值。或者,如果您试图在不评估的情况下理解它,您可以使用Or进行各种形式的检查。

我想这里的主要问题是数组和dict中也有逗号,因此仅使用
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'}
"""

哦,是的,我忘了提到它可能在“,”后面有空格,也可能没有。例如“['variable',function1(1,3)””不起作用。代码的原因是将字符串解析到列表中,然后使用exec(var=list[x])运行它。@sacredcool:有没有理由不同时对其进行大容量解析?抱歉,我不知道大容量解析是什么意思。@sacredcool:比如,为什么不直接执行
allvals=eval(thestring)
,然后为结果的
元组编制索引?哦,这可能会起作用,我很可能误解了eval是如何工作的。我想使用
列表作为一堆括号,但
开放括号
计数器的工作原理相同,更简单。是的,我只是认为regex/python有办法如果不是自己写算法,而是自己写算法,那么我想我必须这样做。