1.9 简化字符串的translate方法的使用
来源:互联网 发布:老年网络大学 编辑:程序博客网 时间:2024/06/01 07:12
《Python Cookbook(第2版)中文版》第1章文本,本章包含了操纵文本的一系列方法和窍门,包括了合并、过滤、格式化字符串以及在整个文本中对部分字符串的替换,还有Unicode的处理。本节为大家介绍简化字符串的translate方法的使用。
AD:2013大数据全球技术峰会课程PPT下载
1.9 简化字符串的translate方法的使用
感谢:Chris Perkins、Raymond Hettinger
任务
用字符串的translate方法来进行快速编码,但却发现很难记住这个方法和string.maketrans函数的应用细节,所以需要对它们做个简单的封装,以简化其使用流程。
解决方案
字符串的translate方法非常强大而灵活,具体细节可参考第1.10节。正因为它的威力和灵活性,将它"包装"起来以简化应用就成了个好主意。一个返回闭包的工厂函数可以很好地完成这种任务:
- import string
- def translator(frm='', to='', delete='', keep=None):
- if len(to) == 1:
- toto = 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
讨论
我经常发现我有使用字符串的translate方法的需求,但每次我都得停下来回想它的用法细节(见第1.10节提供的更多细节信息)。所以,我干脆给自己写了个类(后来改写成了本节中展示的工厂闭包的形式),把各种可能性封闭在一个简单易用的接口后面。现在,如果我需要一个函数来选出属于指定集合的字符,我就可以简单地创建并使用它:
- >>> digits_only = translator(keep=string.digits)
- >>> digits_only('Chris Perkins : 224-7992')
- '2247992'
移除属于某字符集合的元素也同样简单:
- >>> no_digits = translator(delete=string.digits)
- >>> no_digits('Chris Perkins : 224-7992')
- 'Chris Perkins : -'
甚至,我可以用某个字符替换属于某指定集合的字符:
- >>> digits_to_hash = translator(from=string.digits, to='#')
- >>> digits_to_hash('Chris Perkins : 224-7992')
- 'Chris Perkins : ###-####'
虽然后面那个应用显得有点特殊,但我仍然不时地碰到有这种需求的任务。
当然,我的设计有点武断,当delete参数和keep参数有重叠部分的时候,我让delete参数优先:
- >>> trans = translator(delete='abcd', keep='cdef')
- >>> trans('abcdefg')
- 'ef'
对于你的程序,如果keep被指定了,可能忽略掉delete会更好一些,再或者,如果两者都被指定了,抛出个异常也不错,因为在一个对translator的调用中同时指定两者可能没什么意义。另外,和第1.8节和第1.10节相似,本节代码只适用于普通字符串,对Unicode字符串并不适用。参看第1.10节,可以了解到怎样为Unicode字符串编写类似功能的代码,并可看到Unicode的translate方法与普通(单字节)字符串的translate的区别。
闭包
闭包(closure)不是什么复杂得不得了的东西:它只不过是个"内层"的函数,由一个名字(变量)来指代,而这个名字(变量)对于"外层"包含它的函数而言,是本地变量。我们用一个教科书般的例子来说明:
- def make_adder(addend):
- def adder(augend): return augend+addend
- return adder
执行p = make_addr(23)将产生内层函数adder的一个闭包,这个闭包在内部引用了名字addend,而addend又绑定到数值23。q = make_adder(42)又产生另一个闭包,这次名字addend则绑定到了值42。q和p相互之间并无关联,因此它们可以相互独立地和谐共存。现在我们就可以执行它们了,比如,print p(100), q(100)将打印出123 142。
实际上,我们一般认为make_adder指向一个闭包,而不是说什么迂腐拗口的"一个返回闭包的函数"-幸运的是,根据上下文环境,通常这样也不至于造成误解。称make_adder为一个工厂(或者工厂函数)也是简洁明确的;还可以称它为一个闭包工厂来强调它创建并返回闭包,而不是返回类或者类的实例。
更多资料
参看第1.10节中关于本节translator(keep=…)的一个等价实现,以及该节对translate方法的更多描述,还有Unicode字符串的对应方案;Library Reference和Python in a Nutshell中的字符串的translate方法的文档,string模块的maketrans函数的相关内容。
转自:http://book.51cto.com/art/201005/198261.htm
- 简化字符串的translate方法的使用
- 1.9 简化字符串的translate方法的使用
- Python Cookbook 第二版 汉化版 [Recipe 1.9] 简化字符串 translate 方法的用法
- 001_009 Python 字符串Translate的使用
- Python 3.x 字符串的makestrans函数和translate方法使用详解
- translate函数的使用
- translate的使用
- 数据库编程--translate的使用
- OC 简化项目中拼接字符串的方法
- 对canvas的translate()方法的理解
- 对canvas的translate()方法的理解
- 对canvas的translate()方法的理解
- UIImagePickerController的简化使用
- canvas的translate、scale、rotate等方法
- canvas的translate、scale、rotate等方法
- canvas的translate、scale、rotate等方法
- Android 对Canvas的translate方法总结
- 使用EqualsBuilder简化equals的方法的重写
- iOS小技巧
- perl日常处理脚本收集
- 优化查询
- 开源网络库ACE、Boost的ASIO、libevent、libev、ZeroMQ
- 学习uCos之路(2)
- 1.9 简化字符串的translate方法的使用
- 2013年4月网上银行行业网站综合影响力排名
- 坚持,韧性
- gridview数据源来自存储过程
- uva 10617 Again Palindrome
- Portal开发代理设置及证书问题
- Python 字符串方法详解
- 测试 QA 的角色和分工
- 进阶1