三、Maketrans函数
利用maketrans()和translate()函数,我们可以使用一组字符来替换另一组字符。使用这一替换功能时,多少有点繁琐,因为它要求使用maketrans()函数(该函数的作用是把输入字符映射到输出字符)建立一个转换表,然后,再把这个转换表传递给translate()函数。当然,string模块仍然有它自己的maketrans()函数,不过Python 3.1不赞成使用它,而是赞赏使用单独的maketrans()函数来操作字节、字节数组和字符串。
下面的例子演示了如何使用maketrans()和translate()函数处理字节对象。需要注意的是,用于字节的转换表具有256个表项(每一项对应于一个可能的字节),并且这个例子把大部分字节都映射到它们自身,只有1,2和3例外,因为它们分别映射到了4,5和6。如下所示:
>>> tt = bytes.maketrans(b'123', b'456')
>>> len(tt)
256
>>> tt
b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\
t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\
x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\
x1e\x1f !"#$%&\'()*+,-./0456456789:;<=>
?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcd
efghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\
x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\
x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\
x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\
xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\
xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\
xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\
xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\
xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\
xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\
xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\
xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\
xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\
xfa\xfb\xfc\xfd\xfe\xff'
>>> len(tt)
256
>>> tt
b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\
t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\
x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\
x1e\x1f !"#$%&\'()*+,-./0456456789:;<=>
?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcd
efghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\
x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\
x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\
x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\
xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\
xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\
xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\
xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\
xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\
xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\
xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\
xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\
xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\
xfa\xfb\xfc\xfd\xfe\xff'
建好转换表之后,我们只需把它传递给translate()函数即可,如下所示:
>>> b'123456'.translate(tt)
b'456456'
b'456456'
我们还可以传递其它的参数作为要删除的字符:
>>> b'123456'.translate(tt, b'5')
b'45646'
b'45646'
我们可以看到,原来的5已经从123456从删掉了,但是转换得到的5(请记住,我们的映射表将2转化为5)并没有删除。这说明,系统是先从原来的字符串中删除相应的字符,然后才进行的转换操作。
字符串的转换稍微有些不同,字符串版本的maketrans函数返回的是一个字典:
>>> tt = str.maketrans('123', '456')
{49: 52, 50: 53, 51: 54}
>>> '123456'.translate(tt)
'456456'
{49: 52, 50: 53, 51: 54}
>>> '123456'.translate(tt)
'456456'