如果字符串由十六进制字符组成,返回布尔值
我想知道一个字符串是否使用了转义字符来表示十六进制字符。就像 string.isalnum()
这样可以工作:
"\x01".ishex()
返回 True
而
"^".ishex()
返回 False
。
有没有这样的函数存在呢?
如果没有,有没有什么方法可以判断字符串是否只包含转义字符,并返回 True
?
3 个回答
0
没有自动完成这个任务的函数。十六进制编码(无论用什么语言)是用一小部分ASCII字符来表示其他字符。十六进制可以用几种方式表示成字符串,比如“OA”可以被理解为十六进制,或者是某种转义格式的十六进制数字值。确实可以根据一些标准格式写一个函数,但它的可靠性不会是100%。因为这个函数最多只能告诉你这个字符串(其实就是一组字符)肯定不是十六进制,或者“可能是”十六进制。
1
ASCII标准把“可打印字符”定义为从0x20到0x7E之间的字符,所以你只需要检查字符的代码点就可以了。
def is_printable(c):
return ord(c) >= 0x20 and ord(c) <= 0x7E
你也可以检查字符表示的长度,虽然这有点像变通的方法:
def is_hex(s):
return len(repr(s)) > len(s) + 2
>>> is_hex("\x01")
True
>>> is_hex("^")
False
4
"\x01"
实际上并不包含转义字符。它只是一个字符串,里面的第一个字符是值为1的字节。这是因为在 Python 3 之前,Python 用字符串来表示字节数组。
你可以在 REPL 中试试:
>>> "\x30" == "0"
True
>>>
这是因为字符 0
被表示为值为30的字节。
现在,如果你 真的非常非常 想要这样做,你可以使用 Trevor 的小技巧,或者你可以检查字符串中是否有任何不可打印的字符,这些字符会被表示为十六进制序列。
import string
def is_hex(a):
printable = set(string.printable) - set("\x0b\x0c")
return any(c not in printable for c in a)
用法:
>>> is_hex("\x01")
True
>>> is_hex("^")
False
>>>