luggage baggage

Machine learning, data analysis, web technologies and things around me.

Python で ¥ (円マーク)を直接指定して置換するには

こんにちは。吉田弁二郎です。

Python で文字列を扱うのにはちょっとした工夫がいることが多いです。私がこの前つまずいたのは、¥ (円マーク)をある文字列の中で置換するにはどうしたらよいか、ということでした。
例えば、

s = '¥hoge'

という文字列があった時、¥ を適当な文字列で置き換えたいのですが、これは安直に

s = s.replace('¥', 'foo')

とすると SyntaxError となってしまいます。replace 関数に入っている ¥ より後が ¥ 自身によってエスケープされた結果、関数の括弧が閉じていないと判定されてしまうからですね。
解消法は Python のバージョンによって異なり、

import six
if six.PY2:
    # python2
    s = s.decode('utf-8').replace (unichr(165), 'foo')
elif six.PY3:
    # python3
    s = s.replace(chr(165), 'foo')

とすれば目的が達成できると思います。chr/unichr および逆操作を表す ord については、こちらの公式ドキュメントにまとまっています。
2. 組み込み関数 — Python 2.7.x ドキュメント
2. 組み込み関数 — Python 3.5.2 ドキュメント

ちなみになぜこんな特殊な状況について書くことになったかというと、最近デジタル広告運用系の仕事に関わり、Google DoubleClick Bidding Manager がはき出すレポートの中に、なぜか直接 ¥ 記号が書き込まれているのを処理しなきゃいけなくなったからなんです。あれ、何でなんですかね。