在 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
您实际上输入了两个字符,代码点为 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'
>>>
我正在使用 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
您实际上输入了两个字符,代码点为 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'
>>>