つぶやいて...

Python 学習、difflib

仕事で設計書を修正するとき、変更点を残さないといけないという要求があります。 例えば、いいねEntityをあいいじゃEntityに変更時、以下のように色と取り消し線を付けます。

修正する設計書と箇所が多すぎて、手動で処理の場合、時間がかかるし、ミス発生の恐れもあるので、 今回はPythonの標準ライブラリdifflibを使って、自動化で処理します。

difflibでSequenceMatcherというclassを使用して、 置き換え、追加、削除の部分を取得して、文字に色や取り消し線付けられるので、簡単なcodeで自動化実現できます。以下はcode抜粋です。

	highlight_color = "5B9BD5"
	font_name = "MS ゴシック"
    matcher = SequenceMatcher(None, old_text, new_text)
    text_list = []
    for tag, i1, i2, j1, j2 in matcher.get_opcodes():
        match tag:
            case "equal":
                text_list.append(TextBlock(InlineFont(rFont=font_name), new_text[j1:j2]))
            case "replace":
                text_list.append(TextBlock(InlineFont(rFont=font_name, color=highlight_color, strike=True), old_text[i1:i2]))
                text_list.append(TextBlock(InlineFont(rFont=font_name, color=highlight_color), new_text[j1:j2]))
            case "delete":
                text_list.append(TextBlock(InlineFont(rFont=font_name, color=highlight_color, strike=True), old_text[i1:i2]))
            case "insert":
                text_list.append(TextBlock(InlineFont(rFont=font_name, color=highlight_color), new_text[j1:j2]))
    cell.value = CellRichText(*text_list)

Pythonの便利さと強さを改めて実感しました!