orangain flavor

じっくりコトコト煮込んだみかん2。知らないことを知りたい。

Pythonでの文字列置換をマスターする

Pythonの文字列置換は、置換の仕方やバージョンによって利用すべきモジュールが異なっており、少しわかりにくいので、Python 2.xでのstrとunicode、3.xでのstrでの置換をまとめます。

文字列による単純な置換 (str.replace)

str (2.x) / unicode / str (3.x)のどれでもほぼ同じです。

src = 'I like orange.'
dst = src.replace('orange', 'apple') # 'I like apple.'

str.replaceの第3引数で置換を行う最大回数を指定できます。
str.replace (2.x) str.replace (3.x)

正規表現による置換 (re.sub)

str (2.x) / unicode / str (3.x)のどれでもほぼ同じです。

import re
src = 'I like orange.'
dst = re.sub(r'[a-z]+', 'xxx', src) # 'I xxx xxx.'

ここでの説明は省略しますが、re.subの第2引数は関数を取ることも出来ます。
また、第4引数に置換を行う最大回数を指定することが出来ます。さらに、Python 3.1からは第5引数にflagを指定できます。

re.sub (2.x) re.sub (3.x)

キャラクタの置き換え (str.translate)

str (2.x) / unicode / str (3.x)のそれぞれで異なるので、詳しく解説します。実際のところ、この節を書きたいがためにこのエントリを作成しました。

2.x str
import string
src = 'I like orange.'
dst = src.translate(string.maketrans('abcde', 'ABCDE')) # 'I likE orAngE.'

str.translateにはキャラクタの変換を表す長さ256の文字列を渡します。この文字列は、string.maketransを使うと簡単に作ることが出来ます。
また、str.translateの第2引数に文字列を渡すと、その文字列内の文字を削除することが出来ます。

str.translate (2.x) string.maketrans (2.x)

2.x unicode
src = u'I like orange.'
dst = src.translate({
    ord(u'a'): u'A',
    ord(u'b'): u'B',
    ord(u'c'): u'C',
    ord(u'd'): u'D',
    ord(u'e'): u'E',
}) # u'I likE orAngE.'

unicode.translateには、{ord(変換前の文字) => 変換後の文字} というmapを渡します。変換後の文字は長さ2以上でも大丈夫です。
なお、変換後の文字の部分は、ord(変換後の文字)でも可です。また、変換後の文字をNoneとすると、変換前の文字を削除できます。

str.translate (2.x)

3.x str
src = 'I like orange.'
dst = src.translate(str.maketrans('abcde', 'ABCDE')) # 'I likE orAngE.'

3.xのstr.translateは2.xのunicodeとほぼ同じです。2.xのstring.maketransのような書き方もできるようにstr.maketransが追加されています。str.maketransは第3引数に削除したい文字列を渡すと、それに含まれる文字を削除することが出来ます。

また、str.maketransにmapを一つだけ渡した場合は、{変換前の文字 => 変換後の文字} というmapから {ord(変換前の文字) => 変換後の文字} というmapが作られます。

str.translate (3.x) str.maketrans (3.x)

最後に

2.xのunicodeでもmaketrans使いたいです。別に自分で書いてもたいした処理ではないけども。さらに言えばperlのtr///を使えたらもっと幸せ。