[Python] 正規表現(re)を使用した置換で置換後文字列のエスケープシーケンスが展開されてしまう問題の対処
環境
Python 3.7.9
問題
以下のコードにて “kuso\n\nkuso” と出力されてほしいところに、
“kuso
kuso” と表示されてしまう。
1 2 3 |
repl = r'\n\n' print(re.sub('unko', repl, 'kusounkokuso'), end='') |
出力
1 2 3 4 |
kuso kuso |
対処
re — 正規表現操作 — Python 3.7.10 ドキュメント
公式ドキュメントによると、replにエスケープシーケンス文字列が含まれるとエスケープ処理が行われてしまうようなので以下どちらかで対処。
- 文字列変数をraw文字列に変換するrepr()を使用
先頭と末尾に ‘ が付かないようにスライスも使用。
123repl = r'\n\n'print(re.sub('unko', repr(repl)[1:-1], 'kusounkokuso'), end='') - 一旦ダミー文字列に変換してstring.replace()で置換。
12345dummy = '__dummy_str__'repl = r'\n\n'temp = re.sub('unko', dummy, 'kusounkokuso') # 'kuso__dummy_str__kuso'print(temp.replace(dummy,repl), end='')
出力
1 2 |
kuso\n\nkuso |
おわい
re.sub() に repl はエスケープ処理しないオプションとか無いのでしょうか?
おわい