我想检查一个字符串是否是ASCII格式的。

我知道ord(),但是当我尝试ord('é')时,我有TypeError: ord()期望一个字符,但发现长度为2的字符串。我知道这是由我构建Python的方式引起的(如ord()的文档所解释的那样)。

还有别的办法吗?


当前回答

要从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)

其他回答

Python中的sting (str-type)是一系列字节。仅仅通过查看字符串无法判断这一系列字节是否代表ascii字符串、像ISO-8859-1这样的8位字符集的字符串,还是用UTF-8或UTF-16或其他编码的字符串。

但是,如果您知道使用的编码,那么您可以将str解码为unicode字符串,然后使用正则表达式(或循环)检查它是否包含您所关心的范围之外的字符。

import re

def is_ascii(s):
    return bool(re.match(r'[\x00-\x7F]+$', s))

要包含一个空字符串作为ASCII,将+改为*。

您可以使用正则表达式库,它接受Posix标准[[:ASCII:]]定义。

最近遇到了类似的事情,供以后参考

import chardet

encoding = chardet.detect(string)
if encoding['encoding'] == 'ascii':
    print 'string is in ascii'

你可以用在:

string_ascii = string.decode(encoding['encoding']).encode('ascii')

就像@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

我想正则表达式对此进行了很好的优化。