String.replace()は、一部の文字のみを置き換える特殊文字を使用します

Aug 22 2020

このサイトや他のサイトで文字の置換に関するさまざまな投稿を見てきましたが、以前は文字列の置換を行っていました。ただし、この特定の例では、予期しない問題が発生しています。私は私がただ明白な何かを逃していることを望んでいます...

特殊文字のリストをHTMLエンティティコードに置き換えようとしています。バイトエンコードされた文字列を使用して、平文の置換(½から½)から最後の反復まで、これのいくつかのバージョンを試しました(ここで提案されています)

私のコードの機能はとてもシンプルです。ファイルの内容を取得します。

with open(cur_file, 'r', encoding='utf-8') as file_handle:
    file_contents = file_handle.read()
file_handle.close()

次に、「replacer()」関数を呼び出します。

good_text = replacer(file_contents)

replacer()関数の内容:

def replacer(text):
    replace_chars = {
        b'\xc2\xbd': '½',    #½
        b'\xe2\x80\x9c': '"',  #“
        b'\xe2\x80\x9d': '"',  #”
        b'\xe2\x80\x99': '´', #’
        b'\xe2\x80\x93': '—', #–
        b'\xc2\xa9': '©'       #©
    }
    
    for k, v in replace_chars.items():
        good_text = text.replace(k.decode('utf-8'), v)
        print('replacing ' + k.decode('utf-8') + ' with ' + v)
    return good_text

次に、新しいテキストをファイルに保存し直します。

    with open(cur_file, 'w', encoding='utf-8') as file_handle:
        file_handle.write(good_text)
    file_handle.close()
    
    print('Done!')

コンソールで、これを実行して次のようにします。

replacing ½ with ½
replacing “ with "
replacing ” with "
replacing ’ with ´
replacing – with —
replacing © with ©
Done!

これは予想通りです。ただし、文字列を置き換えるファイルの内容は次のとおりです。

replace_chars = {
        '½': '½',
        '“': '"',
        '”': '"',
        '’': '´',
        '–': '—',
        '©': '©'

ファイルに½最初の列にまたは他の文字が含まれていないことを期待しますが、代わりに次のようになります'©': '©'

回答

2 Barmar Aug 22 2020 at 05:23

ループを通過するたびに、前の置換の結果ではなく、元のテキストから置換します。したがって、最終的な結果は、すべてではなく、最後の置き換えにすぎません。

結果を同じ変数に格納するようにループを変更します。

    for k, v in replace_chars.items():
        text = text.replace(k.decode('utf-8'), v)
        print('replacing ' + k.decode('utf-8') + ' with ' + v)
    return text