我正在尝试在python中解析DNS查询。包含两个查询的消息可能如下所示:
07example03org00TTCC13stackoverflow03com00TTCC
第一部分包含请求的域名,其中在域名的每个部分之前是该部分具有的字符数(字节)。最后总是一个空字节。 T和C代表类型和类,它们具有固定长度。
我想通过空字节拆分包含这些消息的字符串。我可以data.split('\x00')
,但这会切断查询的其余部分。
['07example03org00', 'TTCC13stackoverflow03com00', 'TTCC']
我需要这个
['07example03org00TTCC', '13stackoverflow03com00TTCC']
但我只能使用查询的00
部分,而不是TTCC
。
如何按值拆分字符串并将后4个字节添加到上一个拆分部分?
编辑:正如Padraic Cunningham在评论中指出的那样,我不需要在结果中使用零。
答案 0 :(得分:1)
根据您的示例(相应地替换分隔符 - (?:\x00)
而不是(?:00)
),您可以使用:
>>> import re
>>> s = '07example03org00TTCC13stackoverflow03com00TTCC'
>>> re.findall('(.*?(?:00).{4})', s)
['07example03org00TTCC', '13stackoverflow03com00TTCC']
答案 1 :(得分:0)
s = "07example03org\x00TTCC13stackoverflow03com\x00TTCC"
import re
r1 = re.compile("\x00(.{4})")
print(r1.sub(r"\1 ",s, 1).replace("\x00","",1).split()))
['07example03orgTTCC', '13stackoverflow03comTTCC']
这将删除空字节。
答案 2 :(得分:0)
在纯python中,遵循你的例子:
>>>l=('****'+s).split('\x00')
>>>print([x[4:]+y[:4] for x,y in (l[:-1],l[1:])])
['07example03org00TTCC', '13stackoverflow03com00TTCC']
答案 3 :(得分:0)
有一个可选的第二个参数do" split"其中您可以表示要拆分的最大件数(在其余部分中忽略分隔符) -
>>> a = "07example03org\x00TTCC13stackoverflow03com\x00TTCC"
>>> a
'07example03org\x00TTCC13stackoverflow03com\x00TTCC'
>>> a.split("\x00", 1)
['07example03org', 'TTCC13stackoverflow03com\x00TTCC']
>>>
否则,如果您需要删除" \ x00"部分,你只需重新加入你想要的部分:
>>> a = "07example03org\x00TTCC13stackoverflow03com\x00TTCC"
>>> b = a.split("\x00")
>>> b
['07example03org', 'TTCC13stackoverflow03com', 'TTCC']
>>> c = "".join(b[1:])
>>> c
'TTCC13stackoverflow03comTTCC'
>>> b[0]
'07example03org'