我有以下代码:
import string
def translate_non_alphanumerics(to_translate, translate_to='_'):
not_letters_or_digits = u'!"#%\'()*+,-./:;<=>?@[\]^_`{|}~'
translate_table = string.maketrans(not_letters_or_digits,
translate_to
*len(not_letters_or_digits))
return to_translate.translate(translate_table)
这对于非 unicode 字符串非常有效:
>>> translate_non_alphanumerics('<foo>!')
'_foo__'
但对于 unicode 字符串失败:
>>> translate_non_alphanumerics(u'<foo>!')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in translate_non_alphanumerics
TypeError: character mapping must return integer, None or unicode
我无法理解《Unicode 对象》中关于“Unicode 对象”的段落。Python 2.6.2 文档 http://docs.python.org/library/stdtypes.html#string-methods对于 str.translate() 方法。
如何使其适用于 Unicode 字符串?
Translate 的 Unicode 版本需要 Unicode 序数的映射(您可以使用以下命令检索单个字符)ord https://docs.python.org/2/library/functions.html#ord) 到 Unicode 序数。如果你想删除字符,你映射到None
.
我更改了您的函数来构建一个字典,将每个字符的序数映射到您想要翻译的内容的序数:
def translate_non_alphanumerics(to_translate, translate_to=u'_'):
not_letters_or_digits = u'!"#%\'()*+,-./:;<=>?@[\]^_`{|}~'
translate_table = dict((ord(char), translate_to) for char in not_letters_or_digits)
return to_translate.translate(translate_table)
>>> translate_non_alphanumerics(u'<foo>!')
u'_foo__'
edit:事实证明,翻译映射必须从 Unicode 序数映射(通过ord
) 到另一个 Unicode 序数、Unicode 字符串或 None(要删除)。因此我改变了默认值translate_to
成为 Unicode 文字。例如:
>>> translate_non_alphanumerics(u'<foo>!', u'bad')
u'badfoobadbad'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)