Python 检查字符串是否仅包含ASCII字符?
如何在Python中检查字符串是否只包含ASCII字符?类似Ruby的Python 检查字符串是否仅包含ASCII字符?,python,python-2.7,Python,Python 2.7,如何在Python中检查字符串是否只包含ASCII字符?类似Ruby的ascii\u吗? 我想知道在Python 3.7中,从文件中读取的特定于字符串的数据是否为ascii格式,添加了一些方法,这些方法可以满足您的需要: str、bytes和bytearray获得了对新方法的支持,该方法可用于测试字符串或字节是否仅包含ASCII字符 try: 'H€llø'.encode('utf-8') except UnicodeDecodeError: print 'This string
ascii\u吗?
我想知道在Python 3.7中,从文件中读取的特定于字符串的数据是否为ascii格式,添加了一些方法,这些方法可以满足您的需要:
str
、bytes
和bytearray
获得了对新方法的支持,该方法可用于测试字符串或字节是否仅包含ASCII字符
try:
'H€llø'.encode('utf-8')
except UnicodeDecodeError:
print 'This string contains more than just the ASCII characters.'
否则:
>>> all(ord(char) < 128 for char in 'string')
>>> True
>>> all(ord(char) < 128 for char in 'строка')
>>> False
如果您有unicode字符串,则可以使用“encode”函数,然后捕获异常:
try:
mynewstring = mystring.encode('ascii')
except UnicodeEncodeError:
print("there are non-ascii characters in there")
如果有字节,可以导入chardet模块并检查编码:
import chardet
# Get the encoding
enc = chardet.detect(mystring)['encoding']
解决问题的一个方法是尝试用特定的编码方式对字符串进行编码
例如:
'H€llø'.encode('utf-8')
这将引发以下错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 1: ordinal not in range(128)
您也可以选择正则表达式来检查ascii字符<代码>[\x00-\x7F]可以匹配单个ascii字符:
>>> OnlyAscii = lambda s: re.match('^[\x00-\x7F]+$', s) != None
>>> OnlyAscii('string')
True
>>> OnlyAscii('Tannh‰user')
False
您应该捕获预期的
UnicodeDecodeError
错误,而不是基本异常
类。考虑任何原因,如果代码> CARDET。检测< /代码>没有<代码>编码< /代码>键,或者<代码> MySyth将是<代码>列表<代码>或<代码> int >代码>。我想这总是会创建一个完整的列表吗?它会占用更多内存,如果第一个字符是>0x80字符,则速度会变慢,因为它会不断迭代整个字符串(这在大多数应用程序中并不重要,但在某些应用程序中确实如此)。@rubesmoker>我想这将始终创建一个完整的列表不,不会的。all
中的表达式是一个生成器,它一个接一个地提供字符。哪个更快,时间复杂度更低?还是两者都一样?@JavaSa,时间复杂度应该是一样的。哪一个更快-你应该测量一下。我怀疑对于更大的字符串,编码/解码版本更快——它是用C实现的。
>>> OnlyAscii = lambda s: re.match('^[\x00-\x7F]+$', s) != None
>>> OnlyAscii('string')
True
>>> OnlyAscii('Tannh‰user')
False