2012-02-22 11 views
5

Necesito resaltar las diferencias entre dos cadenas simples con python, que encierran las diferentes subcadenas en un atributo HTML span. Así que estoy buscando una forma sencilla de implementar la función se ilustra con el siguiente ejemplo:En python, produce HTML resaltando las diferencias de dos cadenas simples

hightlight_diff('Hello world','HeXXo world','red')

... debe devolver la cadena:

'He<span style="color:red">XX</span>o world'

He buscado en Google y visto difflib mencionado, pero se supone que es obsoleto y no he encontrado ninguna buena demostración simple.

+0

si se encuentra una diferencia, ¿siempre debe mostrar la subcadena de la segunda cadena (en su ejemplo: ''XX'')? Solo estás buscando diferencias de posición ¿no? esto significa, 's1 [0]' con 's2 [0]', 's1 [1]' con 's2 [1]' y así sucesivamente .. – juliomalegria

+0

Esto es similar a la pregunta respondida [Aquí] (http://stackoverflow.com/questions/1576459/generate-pretty-diff-html-in-python) –

+0

@ julio.alegria Bueno, estoy interesado en resaltar la parte diferente de la primera cadena también, 'll' en mi ejemplo. De hecho, estoy buscando diferencias posicionales. – user1069609

Respuesta

7

Todo lo que necesita sale de difflib - por ejemplo:

>>> import difflib 
>>> d = difflib.Differ() 
>>> l = list(d.compare("hello", "heXXo")) 
>>> l 
[' h', ' e', '- l', '- l', '+ X', '+ X', ' o'] 

Cada elemento de la lista es un personaje de sus dos cadenas de entrada, con el prefijo uno de

  • " " (2 espacios), carácter presente en esa posición en ambas cadenas
  • "- " (espacio en el tablero), carácter presente en esa posición en la primera cadena
  • "+ " (más espacio), carácter presente en esa posición en la segunda cadena.

Itere a través de esa lista y puede crear exactamente el resultado que desea crear.

No hay mención de que difflib esté de alguna manera obsoleto o desaprobado en el docs.

+0

¡Gracias, este es exactamente el tipo de cosa que necesitaba! Tuve la idea de que difflib debería estar obsoleto en el libro "Python Essential Reference 4th ed." por D. M. Beazley 2009, página 586: "Procesamiento de cadenas. Los siguientes módulos son algunos módulos antiguos, ahora obsoletos, que se usan para el procesamiento de cadenas ... difflib, fpformat, stringprep, textwrap" – user1069609

Cuestiones relacionadas