2017-04-25 5 views
0

En comparant les exemples d'utilisation difflib.ndiff()difflib - empêcher le remplacement de la ligne entière

from difflib import unified_diff, ndiff 

print("".join(ndiff(
    ["aba\n"], 
    ["abbba\n"] 
))) 

print("".join(ndiff(
    ["aba\n"], 
    ["abbbba\n"] 
))) 

sortie suivante:

- aba 
+ abbba 
? ++ 

- aba 
+ abbbba 

premiers points où les caractères doivent être ajoutés tandis que le second essentiellement abandonné et remplacé toute la ligne.

Comment puis-je faire la seconde impression sur l'équivalent de
« Vous devez insérer 3 « 'b [ici]. »?

Sortie prévue pour la deuxième impression:

- aba 
+ abbbba 
? +++ 

Répondre

1

La détermination sur l'opportunité de montrer que hilighting visuelle des différences est basée sur le rapport de match des deux chaînes étant de 0,75 ou plus. Il est de 0,80 pour votre premier exemple, environ 0,72 pour votre second qui n'a pas été pris dans l'orage.

Il n'existe aucun moyen fourni pour ajuster ce seuil - mais difflib est implémenté en Python pur; vous pouvez copier difflib.py à partir de la bibliothèque Python et le modifier pour qu'il se comporte comme vous le souhaitez. (En Python 2.7 au moins, le seuil est proche du début d'une méthode nommée _fancy_replace.)

Vous pouvez également compenser le difflib existant en remplissant toutes les chaînes avec des espaces, de sorte que leur ratio d'adaptation est plus élevé. Par exemple, avec 10 espaces ajoutés aux deux chaînes, vous pouvez aller jusqu'à comparer aba à abbbbbbbbbba et encore obtenir la différence hilighting.

+0

Merci beaucoup de m'avoir indiqué '_fancy_replace' et j'aime particulièrement l'idée de truquer la ration en ajoutant de l'espace et en les retirant à nouveau. (J'allais juste écraser le '0.75' directement mais cela pourrait devenir problématique avec des chaînes plus longues) –

+0

Ok l'idée de l'espace est de beaucoup de tracas avec plusieurs lignes Je vais juste créer une copie locale de difflib.py –

+0

Je l'ai fait fonctionner. Le difflib coloré fait enfin ce qu'il devrait faire. Voir ici si intéressé: https://github.com/Farbdose/ColoredDifflib –