2011-09-15
看cookbook 看到很神奇的string.translate 函數
可以剔除字串中你不需要的串,並可做 maketrans映射 將一些字元,映射成另外的字元,目前還沒想到應用情境。
cookbook封裝了 translate代碼 建立一個facade 函數:
import string
def translator(frm='', to='', delete='', keep=None):
if len(to) == 1:
to = to * len(frm)
trans = string.maketrans(frm, to)
if keep is not None:
allchars = string.maketrans('', '')
delete = allchars.translate(allchars, keep.translate(allchars, delete))
def translate(s):
return s.translate(trans, delete)
return translate>>> digits_only = translator(keep=string.digits)
>>> digits_only('Chris Perkins : 224-7992')
'2247992'
真正神奇的是 自己列印了 string.maketrans(frm, to) 的值, 結果竟然都是空白。搞了半天沒弄懂是怎麼完成映射的?
走進 lib/string.py 看原始碼,才明白 ,maketrans結果是返回一個256bytes長度的字串,而不是from to都為空白時的空串,windows下竟然什麼都列印不出來,害我跟蹤了大半天。linux下可以看到 字串的完整值,英文字元 數字和一些符號。
trans = string.maketrans(frm, to) 獲得原始的256位元組字串, 然後找到keep和delete的差集作為保留值,最後得出需要保留的串,將原始字串解釋為需要值。