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を指定できます。
キャラクタの置き換え (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引数に文字列を渡すと、その文字列内の文字を削除することが出来ます。
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とすると、変換前の文字を削除できます。
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が作られます。