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'"
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.