下面是我重现问题的方法:
创建一个名为“temp.log”的日志文件并将此行粘贴到其中
DEBUG: packetReceived '\x61\x62\x63'
我想要一个脚本,它将从日志文件中读取行并解码二进制字符串部分 ('\x61\x62\x63')。对于解码,我使用的是结构,所以:
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' ??
旁白:在第一次编辑这个问题时,我假设从文件中读取行与此相同: line = "DEBUG: packetReceived '\x61\x62\x63'" 这使得 packet == 'abc'
但是实际上和这个一样(使用rawstring) line = r"DEBUG: packetReceived '\x61\x62\x63'"
最佳答案
Python 不会解释您传递给正则表达式的字符串。当您定义变量 line
时,转义序列很可能在较早的时候被解释。这可以正常工作,例如:
line = r"DEBUG: packetReceived '\x61\x62\x63'"
print re.compile(r"packetReceived '(.*)'").search(line).group(1)
它打印\x61\x62\x63
。
关于python - 如何在没有python解释的情况下捕获二进制字符串中的所有字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6277762/