Python 突出显示字符串中的某些字节

Python 突出显示字符串中的某些字节,python,string,hex,Python,String,Hex,我的清单如下: \xeb\x1f\x5e\x31\xdb\x88\x5e\x07\x89\x76\x08\x89\x5e\x0c\x8d\x8d\x4e\x08\x8d\x56\x0c\x31\xc0\xb8\x0b\x00\x00\xcd\x80\x31\xf6\X86\xe8\xdc\xdc\xff\x42\x62\x62\x62\x62\x43\x43 我想在字符串中找到\x00和\xcd\x80,并以高亮显示的方式打印它。(例如,使用红色。)。如何执行此操作?如果字符串s是未转义的(\是

我的清单如下:

\xeb\x1f\x5e\x31\xdb\x88\x5e\x07\x89\x76\x08\x89\x5e\x0c\x8d\x8d\x4e\x08\x8d\x56\x0c\x31\xc0\xb8\x0b\x00\x00\xcd\x80\x31\xf6\X86\xe8\xdc\xdc\xff\x42\x62\x62\x62\x62\x43\x43


我想在字符串中找到
\x00
\xcd\x80
,并以高亮显示的方式打印它。(例如,使用红色。)。如何执行此操作?

如果字符串
s
未转义的
\
是真实的,字符),您可以使用:

print(s.replace(r'\x00','\x1b[31m\\x00\x1b[0m') \
       .replace(r'\xcd\x80','\x1b[31m\\xcd\\x80\x1b[0m'))
我们在这里所做的是查找原始字符串
r'\x00'
,并将其替换为
'\x1b[31m\\\x00\x1b[0m'
。这意味着我们在它前面加上
'\x1b[31m'
,然后在它后面加上
'\x1b[0m'

如果我在控制台上使用您的字符串运行此代码,我会得到:

现在这当然不是很方便。所以您可以使用:

def print_highlight(s,markers=(r'\x00',r'\xcd\x80')):
    for marker in markers:
        s = s.replace(marker,'\x1b[31m%s\x1b[0m'%marker)
    print(s)
因此,现在您可以为它提供字符串
s
,以及要突出显示的字符串片段列表。例如:

print_highlight(string,(r'\x31',))

将突出显示所有的
\x31
部分。

如果字符串
s
未转义的(
\
是实数,字符),您可以使用:

print(s.replace(r'\x00','\x1b[31m\\x00\x1b[0m') \
       .replace(r'\xcd\x80','\x1b[31m\\xcd\\x80\x1b[0m'))
我们在这里所做的是查找原始字符串
r'\x00'
,并将其替换为
'\x1b[31m\\\x00\x1b[0m'
。这意味着我们在它前面加上
'\x1b[31m'
,然后在它后面加上
'\x1b[0m'

如果我在控制台上使用您的字符串运行此代码,我会得到:

现在这当然不是很方便。所以您可以使用:

def print_highlight(s,markers=(r'\x00',r'\xcd\x80')):
    for marker in markers:
        s = s.replace(marker,'\x1b[31m%s\x1b[0m'%marker)
    print(s)
因此,现在您可以为它提供字符串
s
,以及要突出显示的字符串片段列表。例如:

print_highlight(string,(r'\x31',))

将突出显示所有
\x31
部分。

突出显示如何使用?您只是在使用IDLE/console吗?字符串是否包含转义部分或未转义部分?@WillemVanOnsem字符串类似于我在主题中输入的内容。@depperm我正在使用terminal。突出显示如何使用?您只是在使用IDLE/console吗?字符串是否包含转义部分或未转义部分?@WillemVanOnsem字符串类似于我在主题中输入的内容。@depperm我在使用terminal。我使用命令print(string.replace(r'\xcd\x80','\033[91m\\xcd\\x80\x1b[0m')或string.replace((r'\x00','\033[91m\\x00\x1b[0m'))。它只突出显示\xcd\x80,第二个不起作用。问题出在哪里?@WolfHowling:您需要将它们链接在一起。在上一个例子中,您在
replace
中打开了一个额外的括号。因此,您向replace传递了一个元组,而不是两个字符串。我使用了命令print(string.replace)(r'\xcd\x80','\033[91m\\xcd\\x80\x1b[0m')或字符串。替换((r'\x00','\033[91m\\x00\x1b[0m'))。它只突出显示\xcd\x80,第二个不起作用。问题出在哪里?@WolfHowling:您需要将它们链接在一起。在最后一个例子中,您在
替换中打开了一个附加的括号。因此,您将一个元组传递给替换,而不是两个字符串。