2017-10-06 50 views
1

ファイル名を比較して重複ファイルを探しています。Pythonの文字列比較

ただし、エスケープされた文字を含むos.walkによって返されるパスが見つかりました。たとえば、あるファイルではstructure in the Earth\'s core.pdf、別のファイルではstructure in the Earth\xe2\x80\x99s core.pdfが得られます。

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 

これらのケースではどうすれば対処できますか?ただ、コメントに反応してQを明確にする

==== 、で区切って他の

  • 1名以上のスペースを含む

    • 1つのファイル名のような重複したファイルのための他の状況もあります-:
    • 1 /中国語日本語の単語を含むファイル名と数字と日本語/中国語の単語で構成される他...によって他しばらく
  • +0

    これらは2つの異なる文字です... '' 'は' ''と等しくありません。 1つを他のものに置き換えるか、または特定の文章の英数字のみを比較します。 – kaza

    +1

    同じ_general_ビジュアルアピアランスを作成するために異なるエンコードを使用しているため、* same *ではありません。 c.f. [this](https://stackoverflow.com/questions/32761954/how-to-decode-an-ascii-string-with-backslash-x-x-code)リンクも同様です。 @bulbusのような別の文字です。それを修正することは、知的には類似しているが、文字通り同じではないことを何通りも言えるようになる可能性のある方法についての虫の蔓延を引き起こすため、複雑です。 –

    +0

    「辞書」表現に煮詰めて、比較する前に英数字以外のものをすべて取り除き、レポートを書くことがあります。 –

    答えて

    1

    多分完全一致の代わりに文字列の類似性を得ることができます。大文字と小文字のような単純なもののために正確な一致が問題になることがあります。

    私は次のことをお勧め:

    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 
    

    この結果は、両方の文字列間の類似度が94%以上であることを示しています。削除する前に項目を削除したりレビューしたりするためのしきい値を定義することができます。