Строка разбора Python, содержащая функции, списки и слова
Я пытаюсь найти способ разобрать строку, которая может содержать переменную, функцию, список или dict, написанные в синтаксисе 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])
, (да, я знаю, что этот способ не рекомендуется)
3 ответа
Регулярные выражения не очень хороши для анализа сложности произвольного кода. Что именно вы пытаетесь достичь? Вы можете (небезопасно) использовать eval
просто оценить строку как код. Или если вы пытаетесь понять это без eval
Кроме того, вы можете использовать ast
или же dis
модули для различных форм осмотра.
Я предполагаю, что главная проблема здесь состоит в том, что массивы и dicts также имеют запятые в них, поэтому просто используя 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'}
"""
Вы пробовали использовать сплит?
>>> 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'}"]