1

我想知道字符串是否使用转义字符来表示十六进制字符。与以下风格相同的东西string.isalnum()

"\x01".ishex()

返回True

"^".ishex()

返回False

有这样的功能吗?

True如果没有,如果它只包含转义字符,是否有任何返回?

4

3 回答 3

4

"\x01"实际上不包含转义字符。它只是一个字符串,其中第一个字符是值为 1 的字节。这是因为——至少在 python 3 之前——python 使用字符串来表示字节数组。

在 REPL 中试试这个:

>>> "\x30" == "0"
True
>>> 

这是因为字符0被表示为一个值为 30 的字节。

现在,如果你真的想这样做。您可以使用特雷弗的 hack,或者您可以检查字符串是否有任何最终被表示为十六进制序列的不可打印字符。

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
>>> 
于 2013-02-24T23:59:42.303 回答
1

ASCII 将“可打印字符”定义为 0x20 到 0x7E 之间的字符,因此您只需检查字符的代码点即可。

def is_printable(c):
  return ord(c) >= 0x20 and ord(c) <= 0x7E

您还可以通过一种 hack 来检查表示的长度:

def is_hex(s):
  return len(repr(s)) > len(s) + 2

>>> is_hex("\x01")
True
>>> is_hex("^")
False
于 2013-02-24T23:59:28.753 回答
0

没有自动执行此操作的功能。十六进制编码(在任何语言中)是“编码”,使用一组有限的 ASCII 代码集字符来表示不同范围内的一些其他字符。十六进制可以用几种方式表示为字符串(“OA”可以解释为十六进制或基于十六进制数值的某种转义格式)。是的,可以根据其中一些标准形式编写函数,但它不会 100% 可靠,因为它可以返回的最好结果是所述字符串(实际上只是一个字符数组)绝对不是或“可能是” '十六进制。

于 2013-02-25T00:04:16.753 回答