如何在Python中检查字符串是否仅包含ASCII字符?类似于Ruby中的ascii_only?
方法。
我希望能够判断从文件读取的特定数据是否为ASCII码。
如何在Python中检查字符串是否仅包含ASCII字符?类似于Ruby中的ascii_only?
方法。
我希望能够判断从文件读取的特定数据是否为ASCII码。
Python 3.7新增了一些方法可以达到你想要的效果:
str
、bytes
以及bytearray
支持新的isascii()
方法,用于测试字符串或字节是否仅包含ASCII字符。
否则:
>>> all(ord(char) < 128 for char in 'string')
True
>>> all(ord(char) < 128 for char in 'строка')
False
另一个版本:
>>> def is_ascii(text):
if isinstance(text, unicode):
try:
text.encode('ascii')
except UnicodeEncodeError:
return False
else:
try:
text.decode('ascii')
except UnicodeDecodeError:
return False
return True
...
>>> is_ascii('text')
True
>>> is_ascii(u'text')
True
>>> is_ascii(u'text-строка')
False
>>> is_ascii('text-строка')
False
>>> is_ascii(u'text-строка'.encode('utf-8'))
False
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']
UnicodeDecodeError
错误,而不是基本的 Exception
类。考虑一下如果由于某种原因 chardet.detect
没有一个 encoding
键,或者 mystring
是一个 list
或 int
会发生什么。 - Martin Tournoij[\x00-\x7F]
可以匹配单个 ASCII 字符:>>> OnlyAscii = lambda s: re.match('^[\x00-\x7F]+$', s) != None
>>> OnlyAscii('string')
True
>>> OnlyAscii('Tannh‰user')
False
'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)
try:
'H€llø'.encode('utf-8')
except UnicodeDecodeError:
print 'This string contains more than just the ASCII characters.'
all
内部的表达式是一个生成器,逐个提供字符。 - warvariucmypy
(http://www.mypy-lang.org) 来静态类型检查类型提示的字符串字面量,将其转换为byte
类型以支持这一努力(在mypy
检查时),而不仅仅依赖于运行时方法(我理解这是这个答案中正在发生的事情 - 如果我误解了,请纠正我)? - Johnny Utahh