4

リビジョンを追跡できるようにする必要があるスクリプトに取り組んでいます。一般的な考え方は、最初のエントリがフィールドの名前 (つまり、「タイトル」または「説明」など) であり、2 番目のエントリがそのフィールドの最初のバージョンであり、3 番目のエントリが次のタプルのリストを与えることです。改訂版。だから、このようなもの:

[("Title", "The first version of the title", "The second version of the title")]

ここでpython docx、スクリプトを使用して、元のバージョンと、太字で変更された新しいバージョンを表示する Word ファイルを作成します。例:


元のタイトル:

これはタイトルの最初のバージョンです

改訂されたタイトル:

これは、タイトルの2 番目のバージョンです。


これを行う方法はpython docx、タプルのリストを作成することです。最初のエントリはテキストで、2 番目のエントリはフォーマットです。したがって、改訂されたタイトルを作成する方法は次のようになります。

paratext = [("This is the ", ''),("second",'b'),(" version of the title",'')]

最近発見しdifflibたので、これはかなり簡単な作業だと思いました。実際、上記のサンプルのような単純な単語の置換については、次の関数で実行できます。

def revFinder(str1,str2):
    s = difflib.SequenceMatcher(None, str1, str2)
    matches = s.get_matching_blocks()[:-1]

    paratext = []

    for i in range(len(matches)):
        print "------"
        print str1[matches[i][0]:matches[i][0]+matches[i][2]]
        print str2[matches[i][1]:matches[i][1]+matches[i][2]]
        paratext.append((str2[matches[i][1]:matches[i][1]+matches[i][2]],''))

        if i != len(matches)-1:
            print ""
            print str1[matches[i][0]+matches[i][2]:matches[i+1][0]]
            print str2[matches[i][1]+matches[i][2]:matches[i+1][1]]
            if len(str2[matches[i][1]+matches[i][2]:matches[i+1][1]]) > len(str1[matches[i][0]+matches[i][2]:matches[i+1][0]]):
                paratext.append((str2[matches[i][1]+matches[i][2]:matches[i+1][1]],'bu'))
            else:
                paratext.append((str1[matches[i][0]+matches[i][2]:matches[i+1][0]],'bu'))

    return paratext

何か他のことをしたいときに問題が発生します。たとえば、'teh' を 'the' に変更すると、th e h生成されます (スペースがないと、書式設定を理解できませんでした)。もう 1 つの問題は、末尾に追加された余分なテキストが変更として表示されない (またはまったく表示されない) ことです。

それで、皆さんへの私の質問は、difflibより複雑なテキスト比較を処理するのに十分強力な代替手段はありますか、それとも、difflib私が望むものにうまく機能するようにするにはどうすればよいでしょうか? 前もって感謝します

4

0 に答える 0