Проверьте, содержит ли строка равное количество фигурных скобок в python

Я хочу проверить, содержит ли строка одинаковое количество скобок, например, допустим, у меня есть такая строка

Привет {{имя}} как дела?

поэтому я хочу проверить, равны ли фигурные скобки вокруг имени или нет.

Я пробовал реализацию стека, но это работает хорошо, только если строка содержит только скобки, а не какой-либо другой символ.

пожалуйста, поделитесь реализацией стека

Md Golam Rahman Tushar 15.12.2020 12:37
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
1
693
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если в строке могут появляться только фигурные скобки:

def check(s, left='{', right='}'):
    b = 0

    for c in s:
        if c == left:
            b += 1
        if c == right:
            if b == 0:
                return False
            b -= 1

    return b == 0

Это упрощенная версия реализации стека. Если у вас есть другие виды скобок, которые вы хотите проверить, вам понадобится реальный стек и просто пропустите символы без скобок в ваших проверках.

Евгений Кузьмович спасибо, что если я хочу проверить точное количество скобок, например, если есть 2 открывающих и 2 закрывающих скобки, то это только считается действительным

Hassan Shahbaz 15.12.2020 14:02

Подумайте, что представляет собой b в этой реализации. Вы можете добавить некоторые проверки во время итераций. Например, если b>2 что-то не так (т.е. "{{{hello}}}"). Если b==1 and c != left что-то не так (т.е. "{a{hello}}"). И т. д.

Yevhen Kuzmovych 15.12.2020 14:05

Евгений Кузьмович, что я могу понять, и это работает, но это не сработало, если строка имеет более одной переменной, например привет {{имя}} {{второе_имя}} и т. д.

Hassan Shahbaz 15.12.2020 14:27

Автор @Evhen Kusmovych работает, но я хочу поделиться еще одной попыткой решить эту проблему. Я хочу показать попытку с регулярным выражением и рекурсией:

import re

def compare_brackets(left, right, test_str, matches):
    regex = r"{}[a-zA-Z0-9\s]*{}".format(left, right)
    match = re.search(regex, test_str, re.MULTILINE)
    if match:
        test_str = test_str[:match.start()] + 'a' + test_str[match.end():]
        matches.append(match.group())
        _, test_str = compare_brackets(left, right, test_str, matches)
    return len(matches), test_str

    
def bad_brackets(left, right, leftover_str, bad_matches):
    regex = r"{}|{}".format(left, right)
    bad_match = re.search(regex, leftover_str, re.MULTILINE)
    if bad_match:
        leftover_str = leftover_str[:bad_match.start()] + 'a' + leftover_str[bad_match.end():]
        bad_matches.append(bad_match.group())
        bad_brackets(left, right, leftover_str, bad_matches)
    return len(bad_matches), leftover_str   

Я реализовал две функции, которые рекурсивно вызывают себя, чтобы сначала найти все подходящие скобки, начиная с первого совпадения внутренних скобок, и удалить их из строки. После того, как все допустимые скобки удалены из строки, вторая функция использует оставшуюся строку и ищет недопустимые скобки.

Я тестировал три разные строки:

count_of_brackets, test_str = compare_brackets('{','}', "Hi {{name}} how are you", [])
count_of_bad_brackets, leftover = bad_brackets('{','}', test_str, [])
print('Found {} valid bracket pairs and {} broken brackets'.format(count_of_brackets, count_of_bad_brackets))

count_of_brackets, test_str = compare_brackets('{','}', "Hi {{{name}}} how are} you",[])
count_of_bad_brackets, leftover = bad_brackets('{','}', test_str, [])
print('Found {} valid bracket pairs and {} broken brackets'.format(count_of_brackets, count_of_bad_brackets))

count_of_brackets, test_str = compare_brackets('{','}', "Hi {{{my name}}} is your {{bodypart}} ok", [])
count_of_bad_brackets, leftover = bad_brackets('{','}', test_str, [])
print('Found {} valid bracket pairs and {} broken brackets'.format(count_of_brackets, count_of_bad_brackets))

выход

Found 2 valid bracket pairs and 0 broken brackets
Found 3 valid bracket pairs and 1 broken brackets
Found 5 valid bracket pairs and 0 broken brackets

Мое решение работает для нескольких пар скобок. Но регулярное выражение также полезно для этой задачи.

Yevhen Kuzmovych 15.12.2020 15:02

О да, я вижу твое изменение b -= 1 сейчас

MaKaNu 15.12.2020 15:07

Другие вопросы по теме