Python - 检查所有分隔符是否匹配并关闭
Python - Check that all delimiters are matched and closed
我正在尝试编写一个 Python 程序,它接受一个字符串并检查是否所有分隔符都已匹配并关闭。
我找到了 this 执行此操作的程序,但遗憾的是它不适用于字符串引号。不幸的是,我不完全理解这个程序是如何工作的,所以我无法修复它。谁能告诉我如何更改程序以适用于字符串定界符(' 和 ")。
我目前的代码是:
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'))
问题是有效字符串的代码 returns false:
print(check_match('This is "hello" world'))
即使遇到关闭 "
,您也在将 "
压入堆栈。
解决方案:尽早检查当前角色是否可以关闭某些东西以及是否有东西在堆栈顶部 (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
我正在尝试编写一个 Python 程序,它接受一个字符串并检查是否所有分隔符都已匹配并关闭。
我找到了 this 执行此操作的程序,但遗憾的是它不适用于字符串引号。不幸的是,我不完全理解这个程序是如何工作的,所以我无法修复它。谁能告诉我如何更改程序以适用于字符串定界符(' 和 ")。
我目前的代码是:
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'))
问题是有效字符串的代码 returns false:
print(check_match('This is "hello" world'))
即使遇到关闭 "
,您也在将 "
压入堆栈。
解决方案:尽早检查当前角色是否可以关闭某些东西以及是否有东西在堆栈顶部 (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