我想检查一个字符串是否是ASCII格式的。
我知道ord(),但是当我尝试ord('é')时,我有TypeError: ord()期望一个字符,但发现长度为2的字符串。我知道这是由我构建Python的方式引起的(如ord()的文档所解释的那样)。
还有别的办法吗?
我想检查一个字符串是否是ASCII格式的。
我知道ord(),但是当我尝试ord('é')时,我有TypeError: ord()期望一个字符,但发现长度为2的字符串。我知道这是由我构建Python的方式引起的(如ord()的文档所解释的那样)。
还有别的办法吗?
当前回答
Vincent Marchetti的想法是正确的,但是str.decode在Python 3中已被弃用。在Python 3中,你可以使用str.encode进行相同的测试:
try:
mystring.encode('ascii')
except UnicodeEncodeError:
pass # string is not ascii
else:
pass # string is ascii
注意,您想要捕获的异常也从UnicodeDecodeError更改为UnicodeEncodeError。
其他回答
要从Python 2.6(以及Python 3.x)改进Alexander的解决方案,您可以使用helper模块curses。ASCII和使用curses.ascii.isascii()函数或其他各种:https://docs.python.org/2.6/library/curses.ascii.html
from curses import ascii
def isascii(s):
return all(ascii.isascii(c) for c in s)
您可以使用正则表达式库,它接受Posix标准[[:ASCII:]]定义。
我使用以下方法来确定字符串是ascii还是unicode:
>> print 'test string'.__class__.__name__
str
>>> print u'test string'.__class__.__name__
unicode
>>>
然后使用一个条件块来定义函数:
def is_ascii(input):
if input.__class__.__name__ == "str":
return True
return False
在Python 3中,我们可以将字符串编码为UTF-8,然后检查长度是否保持不变。如果是,那么原始字符串是ASCII。
def isascii(s):
"""Check if the characters in string s are in ASCII, U+0-U+7F."""
return len(s) == len(s.encode())
要检查,通过测试字符串:
>>> isascii("♥O◘♦♥O◘♦")
False
>>> isascii("Python")
True
就像@RogerDahl的回答一样,但是通过否定字符类和使用搜索而不是find_all或match来短路更有效。
>>> import re
>>> re.search('[^\x00-\x7F]', 'Did you catch that \x00?') is not None
False
>>> re.search('[^\x00-\x7F]', 'Did you catch that \xFF?') is not None
True
我想正则表达式对此进行了很好的优化。