Как найти границы фрагмента в строке 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 шт):
Идея в чём заключается, находим стартовый идекс, а дальше перебираем строку посимвольно.
Если встречаем открывающуюся скобку, то повышаем счетчик, если встречаем закрывающуюся скобку, то уменьшаем счетчик.
Когда все вложения переберем, наш счётчик станет равен 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]