2017-10-06 4 views
1

Je suis à la recherche de fichiers en double en comparant les noms de fichiers.String comparer en python

Cependant, j'ai trouvé que certains chemins retournés par os.walk contiennent des caractères échappés. Par exemple, je peux obtenir structure in the Earth\'s core.pdf pour un fichier et structure in the Earth\xe2\x80\x99s core.pdf pour un autre.

In [1]: print 'structure in the Earth\'s core.pdf\nstructure in the Earth\xe2\x80\x99s core.pdf' 
structure in the Earth's core.pdf 
structure in the Earth’s core.pdf 

In [2]: 'structure in the Earth\'s core.pdf' == 'structure in the Earth\xe2\x80\x99s core.pdf' 
Out[2]: False 

Comment traiter ces cas?

==== Juste pour clarifier le Q en réponse aux commentaires, il y a aussi d'autres situations pour les fichiers en double comme

  • un nom de fichier contenant plus d'espaces que l'autre
  • un nom de fichier séparé par - tandis que l'autre par :
  • un nom de fichier contenant des mots japonais/chinois et l'autre composé de chiffres et de mots japonais/chinois ...
+0

ce sont deux caractères différents ... '' 'n'est pas égal à' ''. Vous remplacez l'un par l'autre ou comparez seulement les caractères alphanumériques d'une phrase donnée. – kaza

+1

Ils ne sont pas * identiques *, car ils utilisent un codage différent pour créer le même aspect visuel _general_. c.f. [this] (https://stackoverflow.com/questions/32761954/how-to-decode-an-ascii-string-with-backslash-x-x-codes) lien pour une discussion similaire. Ce sont des caractères différents, comme le note @bulbus. Fixer cela est compliqué, car cela ouvre une boîte de Pandore sur le nombre de façons possibles de dire quelque chose qui est intellectuellement similaire, mais pas littéralement identique. –

+0

Vous pouvez essayer de les réduire à la représentation "dictionnaire", en supprimant tous les caractères non alphanumériques avant de les comparer et en rédigeant un rapport. –

Répondre

1

Peut-être que vous pouvez obtenir la similarité des chaînes au lieu d'une correspondance exacte. Obtenir la correspondance exacte peut être problématique à cause de choses simples comme la capitalisation.

Je suggère ce qui suit:

from difflib import SequenceMatcher 

s1 = "structure in the Earth\'s core.pdf" 
s2 = "structure in the Earth\xe2\x80\x99s core.pdf" 

matcher = SequenceMatcher() 
matcher.set_seqs(s1, s2) 
print(matcher.ratio()) 
# 0.9411764705882353 

Ce résultat montre que la similitude entre les deux chaînes est de plus de 94%. Vous pouvez définir un seuil à supprimer ou à réviser les éléments avant la suppression.