我正在使用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
已从字符串中删除,但不应该删除。
答案 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
您实际输入了两个字符,其中包含代码点u00c3
和u00a9
。前者是Ã
,这是一个字母字符,第二个是©
,这不是,也就是您的代码将其删除的原因。
现在玩你的代码:
>>> 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)
编辑:您的标题显示“字母数字”,但您的代码也会移除数字。所以有一点不清楚。