Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中使用tail按值拆分字符串_Python_Split - Fatal编程技术网

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

如何在python中使用tail按值拆分字符串,python,split,Python,Split,我正在尝试用python解析DNS查询。包含两个查询的消息可以如下所示: 07example03org00TTCC13stackoverflow03com00TTCC 第一部分包含请求的域名,其中在域名的每个部分之前是该部分具有的字符数(字节)。结尾总是一个空字节。T和C代表类型和等级,它们有固定的长度。 我想将包含这些消息的字符串按空字节拆分。我可以执行data.split('\x00'),但这会切断查询的其余部分 ['07example03org00', 'TTCC13stackoverf

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

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

['07example03org00', 'TTCC13stackoverflow03com00', 'TTCC']
我需要这个

['07example03org00TTCC', '13stackoverflow03com00TTCC']
但是我只能使用查询的
00
部分,不能使用
TTCC

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


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

根据您的示例(适当地替换分隔符-
(?:\x00)
而不是
(?:00)
),您可以使用:

>>> import re
>>> s = '07example03org00TTCC13stackoverflow03com00TTCC'
>>> re.findall('(.*?(?:00).{4})', s)
['07example03org00TTCC', '13stackoverflow03com00TTCC']

这将删除空字节。

在纯python中,下面是您的示例:

>>>l=('****'+s).split('\x00')
>>>print([x[4:]+y[:4] for x,y in (l[:-1],l[1:])])
['07example03org00TTCC', '13stackoverflow03com00TTCC']

还有一个可选的第二个参数do“split”,您可以在其中表示要拆分的最大工件数(剩余部分中忽略分隔符)-

否则,如果需要删除“\x00”部分,可以重新连接所需的部分:

>>> a = "07example03org\x00TTCC13stackoverflow03com\x00TTCC"
>>> b = a.split("\x00")
>>> b
['07example03org', 'TTCC13stackoverflow03com', 'TTCC']
>>> c = "".join(b[1:])
>>> c
'TTCC13stackoverflow03comTTCC'
>>> b[0]
'07example03org'

有趣的是,我们有两种完全不同的
re
方法:0-刚刚注意到50k-恭喜:)@JonClements,干杯,我在看findall,然后我认为空字节无论如何都必须删除,所以不确定下一种方法是什么,我看你接近60k;)字符串是否总是在空字节之前包含00?总是有空字节(在上面的示例中,我使用了“00”,但在实际中它是\x00),因为它是根长度的计数(总是零)。来自RFC1035:域名以根的空标签的零长度八位字节终止。那么为什么要在输出中使用
00
?是的,你说得对,我不需要它们。我把重点放在作为单个查询的部分上,但我没有意识到我不需要那个零。OP希望在第一个子字符串上使用TTCC——对不起——这个答案对他们来说是无用的,而proepr方法实际上使用的是regexp。(或使用纯Python中的状态机创建短代码)
>>> a = "07example03org\x00TTCC13stackoverflow03com\x00TTCC"
>>> a
'07example03org\x00TTCC13stackoverflow03com\x00TTCC'
>>> a.split("\x00", 1)
['07example03org', 'TTCC13stackoverflow03com\x00TTCC']
>>> 
>>> a = "07example03org\x00TTCC13stackoverflow03com\x00TTCC"
>>> b = a.split("\x00")
>>> b
['07example03org', 'TTCC13stackoverflow03com', 'TTCC']
>>> c = "".join(b[1:])
>>> c
'TTCC13stackoverflow03comTTCC'
>>> b[0]
'07example03org'