这是宽容HTML解析器的模型。在此代码中,代替解析HTML和提取属性,标记解析器将很简单。
编写一个解析标记结构并返回其括号形式的函数。开头标签由一个小写字母组成,结束标签由一个大写字母组成。例如,aAbaAB
解析为(a)(b(a))
或以HTML形式解析<a></a><b><a></a></b>
。当然,标签可以并列和嵌套。
必须处理“过早”的关闭标签。例如,在中abcA
,A
闭合最外面a
,因此将其解析为(a(b(c)))
。
多余的结束标记将被忽略:aAB
解析为(a)
。
不处理重叠的标签。例如,根据先前的额外结束标记(-> ()+ (extra))abAB
解析为(a(b))
,而不是。(a(b))(b)
abAB
abA
(a(b))
B
假设输入中没有空格和其他非法字符。
您无权使用任何库。
这是参考实现和测试用例列表:
#!/usr/bin/python
def pars(inpu):
outp = ""
stac = []
i = 0
for x in inpu:
lowr = x.lower()
if x == lowr:
stac.append(x)
outp += "(" + x
i = i + 1
else:
while len(stac) > 1 and stac[len(stac) - 1] != lowr:
outp += ")"
stac.pop()
i = i - 1
if len(stac) > 0:
outp += ")"
stac.pop()
i = i - 1
outp += ")" * i
return outp
tests = [
("aAaAbB", "(a)(a)(b)"),
("abBcdDCA", "(a(b)(c(d)))"),
("bisSsIB", "(b(i(s)(s)))"),
("aAabc", "(a)(a(b(c)))"),
("abcdDA", "(a(b(c(d))))"),
("abcAaA", "(a(b(c)))(a)"),
("acAC", "(a(c))"),
("ABCDEFG", ""),
("AbcBCabA", "(b(c))(a(b))")
]
for case, expe in tests:
actu = pars(case)
print "%s: C: [%s] E: [%s] A: [%s]" % (["FAIL", "PASS"][expe == actu], case, expe, actu)
最短的代码胜出。
AbcBCabA
(应解析为(b(c))(a(b))
我的代码可能是除了这种情况下更短。