【发布时间】:2016-07-07 13:47:02
【问题描述】:
我正在使用 Python 2.7。在 SO 上,我发现了以下用于删除非单词字符的正则表达式:
pat = re.compile('[\W]+', re.UNICODE)
我写了下一个函数:
def leave_only_alphanumeric(string):
pat = re.compile('[\W]+', re.UNICODE)
return re.sub(pat,' ',string)
尽管在以下字符串上:
kr\xc3\xa9m
它会产生错误的结果:
kr\xc3 m
\xa9 已从字符串中删除,但不应删除。
【问题讨论】:
-
你是如何创建字符串的?具体来说,如果它在您的代码中,您是否在字符串前面加上
u? -
您的文本是在
unicode对象还是str对象中? -
@Bakuriu leave_only_alphanumeric(u'kr\xc3\xa9m')
-
这就是问题所在。它应该是
u"kr\xe9m"或"kr\xc3\xa9m"。否则,您的字符串中包含字符é,而不是您所期望的é。因此,您的代码删除了 ©,但没有删除 Ã. -
如果您正在编写 unicode 文本,您应该:1) 确保您的编辑器使用 utf-8 2) 在文件顶部添加
# -.- coding: utf-8 -.-3) 使用leave_only_alphanumeric(u'krém')。或者,使用带有 unicode 转义 的 unicode 文字:u'kr\u00e9m'。否则,您正在编写 bytes 所以没有u前缀并使用两字节转义,然后您必须将decode它转换为unicode对象。但是,您不能混合使用这两种表示。
标签: python regex unicode python-2.x