对于一段文本中存在的多种不同的括号,可以使用顺序扫描的方式一个一个字符的检查,因为每中括号都包括一个开括号和一个闭括号,原则上,在扫描过程中,遇到的闭括号应该与此前遇到的且尚未获得匹配的开括号配对。由于无法预知正文中有多少对括号需要保存,所以使用缓存结构。
上述说明括号的匹配符合后入先出规则,因此使用栈来匹配括号。
匹配括号的流程如下:
- 顺序扫描正文
- 检查中跳过无关字符
- 遇到开括号压入栈
- 遇到闭括号弹出栈顶元素并与之匹配
- 匹配成功则继续,匹配失败则结束
括号种类
# 所有的括号字符
parens = '()[]{}'
# 开括号
open_parens = '([{'
# 配对关系
opposite = {
')': '(',
']': '[',
'}': '{'
}
开始检查:
def check_parens(text):
"""括号匹配
Args:
text: 被检查的正文
"""
parens = '()[]{}'
open_parens = '([{'
opposite = {
')': '(',
']': '[',
'}': '{'
}
def paren_gen(text):
'''括号生成器'''
i, text_len = 0, len(text)
while True:
while i < text_len and text[i] not in parens:
i += 1
if i >= text_len:
return
yield test[i]
i += 1
s = Stack()
for t in paren_gen(text):
if t in open_parens:
s.push(t)
elif:
if opposite[t] != s.pop():
return False
else:
pass
return True