Python - убедитесь, что все разделители совпадают и закрыты - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь написать программу на Python, которая принимает строку и проверяет, все ли разделители были сопоставлены и закрыты.

Я нашел эту программу, которая делает это, но, к сожалению, она не работает для строковых кавычек. К сожалению, я не совсем понимаю, как работает программа, поэтому я не могу это исправить. Может кто-нибудь сказать мне, как изменить программу для работы с разделителями строк ('и ").

Текущий код, который у меня есть:

delimOpens = ['[', ']', '(', ')', '{', '}', '"', "'"]
delimCloseToOpen = {']':'[', ')':'(', '}':'{', '"':'"', "'":"'"}

def check_match(source):
    delimStack = ['sentinel']
    for c in source:
        if c in delimOpens:
            delimStack.append(c)
        elif c in delimCloseToOpen:
            if delimCloseToOpen[c] != delimStack.pop():
                return False
    return (len(delimStack) == 1)

if __name__ == "__main__":
    print(check_match('{(abc)22}[14(xyz)2]'))
    print(check_match('[ { ] }'))
    print(check_match('{ (x) } ['))
    print(check_match('This is "hello" world'))
    print(check_match('This is "hello world'))

Проблема в том, что код возвращает false для правильной строки:

print(check_match('This is "hello" world'))

1 Ответ

0 голосов
/ 03 мая 2018

Вы помещаете " в стек, даже когда вы сталкиваетесь с закрытием ".

Решение: выполните раннюю проверку, может ли текущий символ что-то закрыть и что-то находится в верхней части стека (delimStack[-1]):

delimOpens = ['[', ']', '(', ')', '{', '}', '"', "'"]
delimCloseToOpen = {']':'[', ')':'(', '}':'{', '"':'"', "'":"'"}

def check_match(source):
    delimStack = ['sentinel']
    for c in source:
        if c in delimCloseToOpen and delimCloseToOpen[c] == delimStack[-1]:
            delimStack.pop()
        elif c in delimOpens:
            delimStack.append(c)
        elif c in delimCloseToOpen:
            if delimCloseToOpen[c] != delimStack.pop():
                return False
    return (len(delimStack) == 1)

if __name__ == "__main__":
    print(check_match('{(abc)22}[14(xyz)2]'))
    print(check_match('[ { ] }'))
    print(check_match('{ (x) } ['))
    print(check_match('This is "hello" world'))
    print(check_match('This is "hello world'))

Выход:

$ python3 so_50153245.py
True
False
False
True
False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...