如果字符串由十六进制字符组成,返回布尔值

1 投票
3 回答
2337 浏览
提问于 2025-04-17 16:59

我想知道一个字符串是否使用了转义字符来表示十六进制字符。就像 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
>>> 

撰写回答