[Python] 正規表現(re)を使用した置換で置換後文字列のエスケープシーケンスが展開されてしまう問題の対処

最終更新日

Comments: 0

環境

Python 3.7.9

問題

以下のコードにて “kuso\n\nkuso” と出力されてほしいところに、
“kuso

kuso” と表示されてしまう。

repl = r'\n\n'
print(re.sub('unko', repl, 'kusounkokuso'), end='')

出力

kuso

kuso

対処

re — 正規表現操作 — Python 3.7.10 ドキュメント

公式ドキュメントによると、replにエスケープシーケンス文字列が含まれるとエスケープ処理が行われてしまうようなので以下どちらかで対処。

  • 文字列変数をraw文字列に変換するrepr()を使用

    先頭と末尾に ‘ が付かないようにスライスも使用。

    repl = r'\n\n'
    print(re.sub('unko', repr(repl)[1:-1], 'kusounkokuso'), end='')
    
  • 一旦ダミー文字列に変換してstring.replace()で置換。
    dummy = '__dummy_str__'
    repl = r'\n\n'
    temp = re.sub('unko', dummy, 'kusounkokuso')    # 'kuso__dummy_str__kuso'
    print(temp.replace(dummy,repl), end='')
    

出力

kuso\n\nkuso

おわい

re.sub() に repl はエスケープ処理しないオプションとか無いのでしょうか?

おわい

シェアする

コメントを残す