将python中的字符串的某些字符转化为特定字符是经常用到string库中的maketrans()函数,以及translate()函数。 但是这两个函数比较抽象: maketrans函数产生的对象是一个表,这个数据结构对初学者并不友好。 tranlate(table, deleteValue)函数所需的第一个参数是个表结构,也就是maketrans的返回值,deleteValue是所要删除的字符。这第二个参数很别扭:一个translate函数,有时候还能删除某些字符。 而且使用过程中,往往两个函数是在一起使用的,不如直接把合成为一个函数,更加方便。

在使用translator的过程中,我们经常需要四个参数:源字符串,目标字符串,两者一一对应,要保留的字符,要删除的字符。所以,直接以这四个参数为输入建立新的函数:

import string
def translator(origin='',target='',delete='',keep=''):
    """
    keep is primer than delete
    but keep without chars in delete
    """
    if len(target) == 1:
        target *= len(origin)
    assert(len(target)==len(origin))
    if keep != '':
        allchars = string.maketrans('','')
        keep = keep.translate(allchars,delete)
        delete = allchars.translate(allchars,keep)
    trans = string.maketrans(origin,target)
    def translate(sss):
        return sss.translate(trans,delete)
    return translate

此时的translator函数需要我们先构造函数,然后再调用返回的函数。

比如

>>>trans = translator(delete='abcd',keep='cdef')

>>>trans('abcdefgll')

'ef'

应当注意delete与keep之间的关系。

>>>digit2hash = translator(origin = string.digits,target='@')

>>>digit2hash('myjiayan: 368-346-290')

'myjiayan: @@@-@@@-@@@'

这就是还算不错的translator函数。