Este es un modelo de un analizador de HTML indulgente. En lugar de analizar HTML y extraer atributos, en este campo de código, el analizador de etiquetas será simple.
Escriba una función que analice una estructura de etiqueta y devuelva su forma entre paréntesis. Una etiqueta de apertura consta de una letra minúscula y una etiqueta de cierre consta de una letra mayúscula. Por ejemplo, aAbaAB
analiza en (a)(b(a))
, o en HTML, <a></a><b><a></a></b>
. Por supuesto, las etiquetas pueden estar en yuxtaposición y anidarse.
Las etiquetas cerradas "prematuramente" deben manejarse. Por ejemplo, en abcA
, A
cierra el más externo a
, por lo que analiza en (a(b(c)))
.
Las etiquetas de cierre adicionales simplemente se ignoran: se aAB
analiza en (a)
.
Las etiquetas superpuestas NO se manejan. Por ejemplo, abAB
analiza (a(b))
, no (a(b))(b)
, por la regla anterior de etiquetas de cierre adicionales ( abAB
-> abA
( (a(b))
) + B
(extra)).
Asumiendo que no hay espacios en blanco y otros caracteres ilegales en la entrada.
No tiene permitido usar ninguna biblioteca.
Aquí hay una implementación de referencia y una lista de casos de prueba:
#!/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)
El código más corto gana.
AbcBCabA
(deben analizar como (b(c))(a(b))
Mi código podría haber sido más corto a excepción de este caso..