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

Leave only alphanumeric symbols in string in Python?

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

我认为正则表达式在这里可能有点矫枉过正。

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

编辑:您的标题说 "alphanumeric" 但您的代码也删除了数字。所以有点不清楚。

您混淆了 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'
>>>