Pythonのstring.translate
やstring.maketrans
が情けないので、自分で少し書いてみた。stringmisc.py。デフォルトのstring.translate
より少しはマシだと思う。
import stringmisc print stringmisc.tr("a-z0-9", "A-Z2-90-1", "test0123")
結果は以下のようになる。
TEST2345
ドキュメントのかけらも書いてないのは申し訳ない。
Unicodeにも対応しているので、ひらがな←→カタカナ変換とか全角←→半角変換にも使える。たぶん、ROT13変換とかにも使えるのだろう。そういう、デフォルトの変換セットとか作っておこうかなぁ。
あと、PHPのtrは連想配列(Python用語だと「辞書」?)を引数に取ることができるが、これはstring.tr_array()
という別関数にしてみた。連想配列のキーに正規表現を使うかそうでないかのフラグをつけて。ただ、これでもあんまり厳密じゃないんだよなぁ。Pythonの正規表現は意外にも最長マッチではないみたいで、re.split("(a|abc)", "abcde")
は['', 'abc', 'de']
ではなくて['', 'a', 'bcde']
になる。
trはre.sub
の繰り返しでは実現できないわけだから、あらかじめ作っておいてほしいよ。
PHPのtrを知ったときは目から鱗だった。そうだよ、そうなんだよ、と。
(追記) 2004-03-22 16:53
今さら気づいたんだけど、ちょっとバグっていた。range(ord(str[i-1])+1,ord(str[i+1])-1):
じゃなくて、range(ord(str[i-1])+1,ord(str[i+1])):
だった。-1
はいらない。