def find_next_matching_parens(s: str, pos: int, immediate=False) -> tuple[int, int]:
"""
Находит следующую пару соответствующих круглых скобок в строке.
Args:
s (str): Входная строка, в которой производится поиск.
pos (int): Позиция в строке, с которой начинается поиск.
immediate (bool, optional): Если True, функция проверяет, что символ в позиции pos является открывающей скобкой.
Если это не так, возвращает (None, None). По умолчанию False.
Returns:
tuple[int, int]: Кортеж из двух элементов, где первый элемент - индекс открывающей скобки,
а второй элемент - индекс закрывающей скобки. Если соответствующая закрывающая скобка не найдена,
возвращает (start, None). Если открывающая скобка не найдена, возвращает (-1, None).
"""
if immediate and s[pos] != "(":
return None,None
stack = []
start = s.find("(", pos)
if start == -1:
return -1, None
for i in range(start, len(s)):
if s[i] == "(":
stack.append(i)
elif s[i] == ")":
start = stack.pop()
if len(stack) == 0:
return start, i
return start, None
def get_paren_text_after_name(s: str, name: str, immediate: bool = True) -> str:
"""
Возвращает текст в скобках, следующий за указанным именем в строке.
Аргументы:
s (str): Исходная строка для поиска.
name (str): Имя, после которого нужно найти текст в скобках.
immediate (bool): Если True, ищет ближайшие скобки сразу после имени.
Если False, ищет следующие скобки после имени. По умолчанию True.
Возвращает:
str: Текст в скобках, следующий за именем, или None, если имя не найдено
или скобки не найдены.
"""
pos = s.find(name)
if pos == -1:
print("Имя не найдено")
return None
pos += len(name)
start, end = find_next_matching_parens(s, pos, immediate=immediate)
if start is None or end is None:
print("Скобки не найдены")
return None
return s[start + 1:end]
这可以通过简单的堆栈搜索来完成
例子:
该函数
find_next_matching_parens查找一对括号,该函数get_paren_text_after_name查找名称,然后查找其后面的括号,并检索括号之间的文本。当然,这只是一个例子。您可以改进它,例如,将按名称搜索替换为按正则表达式搜索。或者在名称和括号之间添加缺少的空格。有很多选项,定制适合您的。