今天用到了python str maketrans,顺道看了一下实现原理,做一下记录
# Case conversion helpers
# Use str to convert Unicode literal in case of -U
# 把ascii表的字符放到list中
l = map(chr, xrange(256))
# 把list转换为str
_idmap = str('').join(l)
del l
# Construct a translation string
...
_idmapL = None
def maketrans(fromstr, tostr):
"""maketrans(frm, to) -> string
Return a translation table (a string of 256 bytes long)
suitable for use in string.translate. The strings frm and to
must be of the same length.
"""
# 保证fromstr和tostr长度一致,不然下面替换的代码就会报错
if len(fromstr) != len(tostr):
raise ValueError, "maketrans arguments must have same length"
global _idmapL
# 再把ascii的字符串转换为list
if not _idmapL:
_idmapL = list(_idmap)
# 列表切片产生的是列表的副本,与原列表不是同一份空间,对L的操作不会影响到_idmapL
L = _idmapL[:]
# 把fromstr每一个需要替换的字符在ascii表中的位置放到fromstr的list中
fromstr = map(ord, fromstr)
# 执行具体的替换操作
for i in range(len(fromstr)):
L[fromstr[i]] = tostr[i]
# 返回替换后的ascii表字符串
return ''.join(L)
大概思路是,把ascii表放到一个list中,然后把list中需要替换的字符,替换为新的字符。所以才会要求fromstr和tostr大小一致,该方法返回的长度固定为256。
这个方法是结合str.translate()一起使用的,maketrans生成一个字符字典,str.translate()方法根据这个字典,替换str中相关的字符,具体的替换操作,另起一篇。
ord函数解释:http://www.runoob.com/python/python-func-ord.html
map函数解释:http://www.runoob.com/python/python-func-map.html