我想检查一个字符串是否是ASCII格式的。
我知道ord(),但是当我尝试ord('é')时,我有TypeError: ord()期望一个字符,但发现长度为2的字符串。我知道这是由我构建Python的方式引起的(如ord()的文档所解释的那样)。
还有别的办法吗?
我想检查一个字符串是否是ASCII格式的。
我知道ord(),但是当我尝试ord('é')时,我有TypeError: ord()期望一个字符,但发现长度为2的字符串。我知道这是由我构建Python的方式引起的(如ord()的文档所解释的那样)。
还有别的办法吗?
当前回答
就像@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
我想正则表达式对此进行了很好的优化。
其他回答
def is_ascii(s):
return all(ord(c) < 128 for c in s)
这样做怎么样?
import string
def isAscii(s):
for c in s:
if c not in string.ascii_letters:
return False
return True
你的问题不正确;你看到的错误不是你如何构建python的结果,而是混淆了字节字符串和unicode字符串。
字节字符串(例如:“foo”,或“bar”,在python语法中)是八字节序列;0-255之间的数字。Unicode字符串(例如u"foo"或u'bar')是Unicode码位的序列;0-1112064之间的数字。但是您似乎对字符é感兴趣,它(在您的终端中)是表示单个字符的多字节序列。
不要用ord(u'é'),试试这个:
>>> [ord(x) for x in u'é']
它告诉您“é”表示哪个代码点序列。它可能给你[233],也可能给你[101,770]。
用unichr()代替chr()来扭转这一局面:
>>> unichr(233)
u'\xe9'
这个字符实际上可以用一个或多个unicode“码点”表示,这些码点本身既可以表示字素,也可以表示字符。它要么是“带有重音的e(即代码点233)”,要么是“e”(代码点101),后面跟着“前一个字符的重音”(代码点770)。因此,这个完全相同的字符可以表示为Python数据结构u'\ u0301'或u'\u00e9'。
大多数情况下,您不应该关心这个问题,但是如果在unicode字符串上迭代,它就会成为一个问题,因为迭代是按代码点进行的,而不是按可分解字符进行的。换句话说,len(u'\ u0301') == 2和len(u'\u00e9') == 1。如果这对您很重要,您可以使用unicodedata.normalize在组合表单和分解表单之间进行转换。
Unicode Glossary可以作为理解其中一些问题的有用指南,它指出每个特定术语如何引用文本表示的不同部分,这比许多程序员意识到的要复杂得多。
您可以使用正则表达式库,它接受Posix标准[[: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
我想正则表达式对此进行了很好的优化。