Python анализирует вложенные скобки

Я хочу разобрать строку с вложенными скобками во вложенный список.

Пример - parse_nested("abc(def(gh)ij)klm") -> ["abc", ["def", ["gh"], "ij"], "klm"].

Мой код работает, но мне было интересно, есть ли лучший способ сделать это.

Вот мой код (позже я напишу проверки, чтобы поймать искаженный ввод):

def match(s, start, stop):
    start = c = s.index(start)
    level = 0
    while c < len(s):
        if s[c] == start:
            level += 1
        elif s[c] == stop:
            level -= 1
        if level == 0:
            return (start+1, c)
        c += 1
    return None

def parse_nested(s):
    if start not in s and stop not in s:
        return s
    else:
        g = match(s, start, stop)
        first = s[:g[0]-1]
        middle = parse_nested(s[g[0]:g[1]])
        last = parse_nested(s[g[1]+1:])
        result = [first] if first else []
        if type(middle) == str:
            result.append([middle])
        else:
            result.append(middle)
        if last:
            if type(last) == str:
                result.append(last)
            else:
                result += last
        return result

Если не считать использования библиотеки синтаксического анализа, есть ли более короткий/лучший способ сделать это?


person rlms    schedule 01.02.2014    source источник
comment
Кажется, больше подходит для codereview.stackexchange.com   -  person Bart Kiers    schedule 01.02.2014
comment
@BartKiers Изначально я планировал опубликовать там, но я ищу совершенно другой подход, поэтому я подумал, что он больше подходит для этого. Возможно, мне не стоило менять свое мнение.   -  person rlms    schedule 01.02.2014
comment
Я согласен, что это дубликат этого вопроса, я не знаю, как я не увидел его, когда искал.   -  person rlms    schedule 01.02.2014
comment
Я написал этот код   -  person Grijesh Chauhan    schedule 01.02.2014
comment
@GrjeshChauhan Я думал о решении, похожем на это, но оно не кажется расширяемым для анализа строки с различными типами вложенных символов (например, ( и ‹) или для использования в языке без eval.   -  person rlms    schedule 01.02.2014
comment
@sweeneyrod Вместо eval вы можете использовать 31.2. ast — Abstract Syntax Trees¶. Почему нельзя с другим? Просто замените ( на > в коде. (Я использовал eval, потому что Codepad не import ast)   -  person Grijesh Chauhan    schedule 01.02.2014
comment
@GrjeshChauhan Как если бы я хотел расширить его, чтобы вместо списков у меня были объекты-контейнеры, в которых были как элементы, так и тип разделителя, используемый для их создания.   -  person rlms    schedule 01.02.2014
comment
затем напишите код как функцию что-то вроде def parse(string, delimiter): code ..s = s.replace("," + delimiter, string)...1   -  person Grijesh Chauhan    schedule 01.02.2014