Как найти границы фрагмента в строке Python?

Имеется строка:

{bla} A {tla B {gla C {dla} D } E } F {mla}

из этой строки надо выбрать фрагмент:

{tla B {gla C {dla} D } E }

Здесь существует вложенный элемент "dla", а также, каждый элемент имеет "имя", мне нужно выбрать элемент "tla" целиком: от начала "{tla" до его окончания "}".

Написан такой код:

#!/usr/bin/python3
# -*- coding: utf-8 -*-

text = "{bla} A {tla B {gla C {dla} D } E } F {mla}"

name_id = "tla"
start = text.index('{' + name_id)

test = start
while test <= len(text):
    test_open = text.find('{', test)
    test_close = text.find('}', test)
    if test_close < test_open:
        break
    else:
        test = test_close + 1

end = test_close

print(text[start:end])

Выполняю:

{tla B {gla C {dla} D

Понятно, что этот алгоритм написан до того как он столкнулся с вложенностью.

Вопрос: как решить такую задачу разбора строки и (желательно) встроенными средствами Python?


Ответы (1 шт):

Автор решения: Amgarak

Идея в чём заключается, находим стартовый идекс, а дальше перебираем строку посимвольно.

Если встречаем открывающуюся скобку, то повышаем счетчик, если встречаем закрывающуюся скобку, то уменьшаем счетчик.

Когда все вложения переберем, наш счётчик станет равен 0, вот и параметры для среза получены.

def search(s, start_index):
    count = 0
    for i in range(start_index, len(s)):
        if s[i] == '{':
            count += 1
        elif s[i] == '}':
            count -= 1
            if count == 0:
                return s[start_index:i+1]

s = "{bla} A {tla B {gla C {dla} про{*@%»+} роо{} D } E } F {mla}"

start_index = s.find('{tla')
if start_index != -1:
    rezult = search(s, start_index)
    print(rezult)

{tla B {gla C {dla} про{*@%»+} роо{} D } E }

[Program finished]

→ Ссылка