Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 检查字符串是否仅包含ASCII字符?_Python_Python 2.7 - Fatal编程技术网

Python 检查字符串是否仅包含ASCII字符?

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

如何在Python中检查字符串是否只包含ASCII字符?类似Ruby的
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