如何在没有python解释的情况下捕获二进制字符串中的所有字符

Phi*_*rke 3 python regex struct

以下是我重现问题的方法:

创建一个名为"temp.log"的日志文件并将此行粘贴到其中

DEBUG: packetReceived '\x61\x62\x63'

我想有一个脚本,它将从日志文件中读取行并解码二进制字符串部分('\ x61\x62\x63').对于解码,我使用struct,所以:

struct.unpack('BBB', '\x61\x62\x63')

应该给我

(97, 98, 99)

这是我正在使用的脚本

import re
import struct
import sys

f = open(sys.argv[1], 'r')
for line in f:
    print line
    packet = re.compile(r"packetReceived \'(.*)\'").search(line).group(1)

    # packet is the string r'\x61\x62\x63'
    assert(len(packet), 12)

    # this works ok (returns (97, 98, 99))
    struct.unpack('BBB', '\x61\x62\x63')

    # this fails because packet is interpreted as r'\\x61\\x62\x63'
    struct.unpack('BBB', packet)

我使用temp.log作为脚本的参数来运行脚本.

希望这些评论突出我的问题.如何将变量包解释为'\ x61\x62\x63'?

ASIDE:在第一次编辑这个问题时,我假设读取文件中的行与此相同:line ="DEBUG:packetReceived'\ x61\x62\x63'",这使得数据包=='abc'

但它实际上与此相同(使用rawstring)line = r"DEBUG:packetReceived'\ x61\x62\x63'"

Wla*_*ant 5

Python不解释传递给正则表达式的字符串.当您定义变量时,转义序列很可能在之前被解释line.这可以正常工作,例如:

line = r"DEBUG: packetReceived '\x61\x62\x63'"
print re.compile(r"packetReceived '(.*)'").search(line).group(1)
Run Code Online (Sandbox Code Playgroud)

它打印\x61\x62\x63.