Python 解析包含函数、列表和字典的字符串
Python parse string containing functions, lists and dicts
我正在尝试寻找方法来解析可以包含变量、函数、列表或用 python 语法编写的 dict 的字符串,并用“,”分隔。空格应该在任何地方都可用,所以当它不在 ()、[] 或 {} 内时,用 "," 分隔。
示例字符串:"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])
解析它。 (是的,我知道这可能不是推荐的做事方式)
你试过使用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
将字符串评估为代码。或者,如果您想在不 eval
的情况下理解它,您可以使用 the ast
or dis
modules 进行各种形式的检查。
我想这里的主要问题是数组和字典中也有逗号,所以只使用 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'}
"""
我正在尝试寻找方法来解析可以包含变量、函数、列表或用 python 语法编写的 dict 的字符串,并用“,”分隔。空格应该在任何地方都可用,所以当它不在 ()、[] 或 {} 内时,用 "," 分隔。
示例字符串:"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])
解析它。 (是的,我知道这可能不是推荐的做事方式)
你试过使用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
将字符串评估为代码。或者,如果您想在不 eval
的情况下理解它,您可以使用 the ast
or dis
modules 进行各种形式的检查。
我想这里的主要问题是数组和字典中也有逗号,所以只使用 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'}
"""