在Python中只保留字符串中的字母数字符号?

时间:2016-07-07 13:47:02

标签: python regex unicode python-2.x

我正在使用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已从字符串中删除,但不应该删除。

2 个答案:

答案 0 :(得分:4)

您正在混淆unicode代码点和utf-8编码。

您要处理的信件是é,代码点u00e9 它在utf-8中编码为两个字节,0xc3和0xa9。

尝试:

>>> "kr\xc3\xa9m".decode('utf-8')
u'kr\xe9m'
>>> print("kr\xc3\xa9m")
krém
>>> print(u"kr\xe9m")
krém

使用u"",您必须使用实际的代码点。使用原始""时,python只会看到一串字节。

请注意,第二行只能使用,因为我的终端编码是utf-8,否则我会看到乱码输出。

结果,你的字符串不是你想象的那样:

>>> print(u"kr\xc3\xa9m")
krém

您实际输入了两个字符,其中包含代码点u00c3u00a9。前者是Ã,这是一个字母字符,第二个是©,这不是,也就是您的代码将其删除的原因。

现在玩你的代码:

>>> def leave_only_alphanumeric(string):
...   pat = re.compile('[\W]+', re.UNICODE)
...   return re.sub(pat,' ',string)
...
>>> leave_only_alphanumeric(u"kr\xe9m")
u'kr\xe9m'
>>> leave_only_alphanumeric("kr\xc3\xa9m")   # this is not unicode
'kr\xc3 m'                                   #     -> thus the wrong result
>>> leave_only_alphanumeric("kr\xc3\xa9m".decode('utf-8'))
u'kr\xe9m'
>>> leave_only_alphanumeric("kr\xc3\xa9m".decode('utf-8')).encode('utf-8')
'kr\xc3\xa9m'
>>>

答案 1 :(得分:2)

我相信正则表达式在这里可能有些过分。

def leave_only_alphanumeric(string):
    return ''.join(ch if ch.isalnum() else ' ' for ch in string)

编辑:您的标题显示“字母数字”,但您的代码也会移除数字。所以有一点不清楚。