我需要将一些非ASCII的字符更改为“_”。 例如,
Tannh‰user -> Tannh_user
答案 0 :(得分:9)
re.sub(r'[^\x00-\x7F]', '_', theString)
如果theString是unicode,或者ASCII编码占用0到0x7F(latin-1,UTF-8等)的编码中的字符串,这将有效。
答案 1 :(得分:5)
使用Python对字符编码的支持:
# coding: utf8
import codecs
def underscorereplace_errors(exc):
return (u'_', exc.end)
codecs.register_error('underscorereplace', underscorereplace_errors)
print u'Tannh‰user'.encode('ascii', 'underscorereplace')
答案 2 :(得分:4)
针对Python 3进行了更新:
>>> 'Tannh‰user'.encode().decode('ascii', 'replace').replace(u'\ufffd', '_')
'Tannh___user'
首先我们使用encode()
创建字节字符串 - 它默认使用UTF-8编解码器。如果你有字节字符串,那么当然跳过这个编码步骤。
然后我们使用ascii编解码器将其转换为“普通”字符串。
这使用UTF-8的属性,所有非ascii字符都被编码为值为> = 0x80的字节序列。
原始答案 - 适用于Python 2:
如何使用内置str.decode
方法执行此操作:
>>> 'Tannh‰user'.decode('ascii', 'replace').replace(u'\ufffd', '_')
u'Tannh___user'
(您获得unicode
字符串,如果需要,请将其转换为str
。)
您还可以将unicode
转换为str
,因此一个非ASCII字符将替换为ASCII字符。但问题是unicode.encode
replace
将非ASCII字符转换为'?'
,因此您不知道问号是否已存在;见Ignacio Vazquez-Abrams的解决方案。
另一种方法,使用ord()
并比较每个字符的值,如果它适合ASCII范围(0-127) - 这适用于unicode
字符串和utf-8中的str
,拉丁语和其他一些编码:
>>> s = 'Tannh‰user' # or u'Tannh‰user' in Python 2
>>>
>>> ''.join(c if ord(c) < 128 else '_' for c in s)
'Tannh_user'
答案 3 :(得分:2)
我宁愿在字符串中的每个字符上调用ord
,1乘1.如果ord([char]) >= 128
该字符不是ascii字符,应该被替换。
答案 4 :(得分:1)
如果您知道要替换哪些字符,则可以应用字符串方法
mystring.replace('oldchar', 'newchar')
答案 5 :(得分:1)
使用神奇的正则表达式[ -~]
可以解决这个问题:
import re
re.sub(r"[^ -~]", "_", "Tannh‰user")
# 'Tannh_user'
说明:
[ -~]
会捕获所有ascii字符^
,我们可以捕获所有非ASCII字符答案 6 :(得分:0)
回答问题
'[\u0080-\uFFFF]'
将匹配前128个字符以外的任何UTF-8字符
re.sub('[\u0080-\uFFFF]+', '_', x)
将用下划线替换任何连续的非ASCII字符序列