我最近在Python中学习了堆栈(我为其创建了一个类),并且我了解到你可以使用它们来检查括号是否平衡,这是每个开始符号都有一个相应的结束符号和一对括号正确嵌套。
现在我正在尝试使用堆栈来执行相同的操作,但使用HTML。例如,我的程序将采用以下文档 -
<html>
<head>
<title>
Example
</title>
</head>
<body>
<h1>Hello, world</h1>
</body>
</html>
并检查它以确保它具有正确的打开和关闭标签。
我甚至不知道从哪里开始,我很困惑。任何帮助表示赞赏。
答案 0 :(得分:3)
如果你想以这种方式解决问题,请考虑一下你之前做过的事情:
您使用了一个堆栈来跟踪(
,[
或{
。
(
和<html>
之间的区别是什么?其中一个只是一组角色。因此,更改您的代码 - 而不是读取单个字符并将其放在堆栈上,阅读标记并将其放在堆栈上。
您可能还想确定是否要确保您拥有一些有效的(ish)HTML - 即如果遇到<<html>
会发生什么?
答案 1 :(得分:0)
#Old interesting question:use usual stack for pop, push, and peek
#inserted space for each ">x" and "x<" where x is any char,
import re
text='''<html>
<head>
<title>
Example
</title>
</head>
<body>
<h1>Hello, world</h1>
</body>
</html>'''
def check_html_balance(text):
s=Stack()
x=text.replace('<', ' <'); y=x.replace('>', '> ')
a=[w for w in y.split() if re.search('<\S+>',w)]
b=[w for w in a if "/" not in w]
c=[w for w in a if "/" in w]
for w in text.split():
if w in b:
s.push(w)
elif not s.is_empty() and (w in c) and (w.replace('/','')==s.peek()):
s.pop()
return s.is_empty()
check_html_balance(text)
答案 2 :(得分:0)
# A second, shorter solution without replacing "x<" by "x <"...
text='''<html>
<head>
<title>
Example
</title>
</head>
<body>
<h1>Hello, world</h1>
</body>
</html>'''
import re
def check_balance(text):
L=re.split('(<[^>]*>)', text)[1::2]
s=Stack()
for word in L:
if ('/' not in word):
s.push(word)
elif not s.is_empty() and (word.replace('/','')==s.peek()):
s.pop()
return s.is_empty()
check_balance(text)