2017-01-04 12 views
2

ファジー検索ではいくつかのリソースが見つかりますが、ファジーファイル/文字列比較では何も見つかりません。単純な違い(日付や電子メールアドレスなど)を無視してファイルを比較する方法はありますか?ファジーファイル差分

私は2つの文字列と正規表現のリストを渡すことができる関数/ツールについて考えていました。戻り値は、渡された正規表現に一致するもの以外のdiffのリストになります。

最初のパスとして、私はdifflibをラップすることを考えていましたが、渡された正規表現との違いのペアをテストしましたが、これを達成するためのよりよい方法はありますか?

+2

あなたがそれらを識別できると仮定して、日付と電子メールアドレスのようなものを匿名化することができます。 're.sub'を使ってファイルを何度か調べると、すべての日付を' 00/00/0000'に置​​き換えて、他のデータでも同じようにすることができます。私は、文字列を消費し、その文字列の匿名化バージョンを生成するジェネレータパイプラインのように設定します。 –

+0

@PatrickHaughこれは、difflibをラップするのが難しくなっても、簡単な方法です。代わりに関数に辞書を渡すことができます: '{'PLACEHOLDER':regexp}'ここで、日付の場合、正規表現のリストを持つことができます。 – arewm

答えて

1

各タプルは、正規表現と文字列

[(r'\d\d?/\d\d?/\d\d\d\d', '00/00/0000'), ...] 

を有している場合我々は難読化re.subを使用して、連続置換を行います。このうち発電機のパイプラインを構築することができ、あなたはタプルのリストを持っているとしましょう日付、時刻、電子メールアドレスのようなものの違いなど最後forループでは

import re 

def replace(pat, repl, iterable): 
    pat = re.compile(pat) 
    for string in iterable: 
     yield pat.sub(repl, string) 

def reader(filelist): 
    for name in filelist: 
     with open(name) as f: 
      yield f.read() 

filelist = ['filename1.txt', 'filename2.txt', ...] 
patterns = [(r'\d\d?/\d\d?/\d\d\d\d', '00/00/0000'), ...] 
source = reader(filelist) 
gen = source 
for pat, repl in patterns: 
    gen = replace(pat, repl, gen) 
for string in gen: 
    print(string) 

genは、ファイルのサニタイズ内容を生成するジェネレータです。ここではそれらを印刷しますが、ファイルに書き戻したり、保存したり、一度に1つずつ分析したり、反復的にdiffを実行したりすることができます。

+0

このアプローチは、行われる各置換のためにファイルを開きますか?私はジェネレータの使用に慣れていません。 – arewm

+0

@ anon01いいえ。ファイルは文字列に読み込まれ、すべての操作が実行されます。これは 'reader'で起こります。残りのパイプラインは文字列のみを処理します。このようにジェネレータについてもっと考えてみたいのであれば、[David Beazleys presentation](http://www.dabeaz.com/generators-uk/)をお勧めします –