如何在python中使用tail将值拆分为字符串

时间:2015-06-06 20:01:44

标签: python split

我正在尝试在python中解析DNS查询。包含两个查询的消息可能如下所示:

07example03org00TTCC13stackoverflow03com00TTCC

第一部分包含请求的域名,其中在域名的每个部分之前是该部分具有的字符数(字节)。最后总是一个空字节。 T和C代表类型和类,它们具有固定长度。 我想通过空字节拆分包含这些消息的字符串。我可以data.split('\x00'),但这会切断查询的其余部分。

['07example03org00', 'TTCC13stackoverflow03com00', 'TTCC']

我需要这个

['07example03org00TTCC', '13stackoverflow03com00TTCC']

但我只能使用查询的00部分,而不是TTCC

如何按值拆分字符串并将后4个字节添加到上一个拆分部分?

编辑:正如Padraic Cunningham在评论中指出的那样,我不需要在结果中使用零。

4 个答案:

答案 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'