我有一些从串口提取数据的代码,在打印之前,我想确保我得到的是一个可打印的字符串(即ASCII,也许是UTF-8)。有没有这样做的函数?我寻找的前六个地方,没有任何看起来像我想要的东西。(string has printable,但我没有看到任何东西(在那里,或者在the string methods中)来检查一个字符串中的每个字符是否都在另一个字符串中。
注意:对于我来说,控制字符是而不是可打印的。
编辑:我正在寻找一个单一的函数,而不是一个自己的解决方案:
我最终得到的结论是:
all(ord(c) < 127 and c in string.printable for c in input_str)
发布于 2010-09-03 23:34:06
正如您所说的string
module has printable
,这只是检查字符串中的所有字符是否都是printable
格式的情况
>>> hello = 'Hello World!'
>>> bell = chr(7)
>>> import string
>>> all(c in string.printable for c in hello)
True
>>> all(c in string.printable for c in bell)
False
您可以将这两个字符串转换为集合-这样集合将包含字符串中的每个字符一次-并检查由您的字符串创建的集合是否is a subset of可打印的字符:
>>> printset = set(string.printable)
>>> helloset = set(hello)
>>> bellset = set(bell)
>>> helloset
set(['!', ' ', 'e', 'd', 'H', 'l', 'o', 'r', 'W'])
>>> helloset.issubset(printset)
True
>>> set(bell).issubset(printset)
False
因此,总而言之,您可能希望这样做:
import string
printset = set(string.printable)
isprintable = set(yourstring).issubset(printset)
发布于 2010-09-03 23:29:19
try
/except
似乎是最好的方式:
def isprintable(s, codec='utf8'):
try: s.decode(codec)
except UnicodeDecodeError: return False
else: return True
我不会依赖string.printable
,它可能认为“不可打印”的控制字符通常可以“打印”用于终端控制目的(例如,在“着色”ANSI转义序列中,如果您的终端符合ANSI标准)。当然,这取决于你想要检查这个的确切目的!-)
发布于 2011-07-29 23:42:06
>>> # Printable
>>> s = 'test'
>>> len(s)+2 == len(repr(s))
True
>>> # Unprintable
>>> s = 'test\x00'
>>> len(s)+2 == len(repr(s))
False
https://stackoverflow.com/questions/3636928
复制相似问题