Строка разбора 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'}"]
Другие вопросы по тегам