Вы можете использовать enumerate
:
regex = b'\x01\x03(?(?!\x01\x03).)*'
chunk_lengths = {index: len(chunk) for index, chunk in enumerate(re.findall(regex, data))}
Вы изначально использовали re.findall
для получения каждого фрагмента в исходных данных, который следует вашему заданному регулярному выражению.Это bytes
объекты, которые имеют четко определенную длину (количество байтов в них).
С помощью оператора len
мы можем найти длину каждого чанка, и они сформируютзначения нашего словаря.Если бы мы сделали [len(chunk) for chunk in re.findall(regex, data))]
, это дало бы нам список длин всех найденных фрагментов, в порядке их поиска (это будет важно позже).
enumerate
является встроенной функцией, которая позволяет «пометить» индекс (по умолчанию начиная с 0) для некоторого итерируемого объекта.Итак, скажем, у вас есть list
[5, 3, 4]
, представляющий куски длины.Если вы примените enumerate
к нему, вы получите tuple
s (0, 5)
(индекс 0, длина 5), (1, 3)
(индекс 1, длина 3) и (2, 4)
(индекс 2, длина 4).
Теперь, собрав все вместе в dict
понимании, мы становимся более способными получить доступ к длинам фрагментов по индексу, созданному enumerate
.Поскольку, как отмечено выше, findall
возвращает список результатов по порядку, а перечисление также работает по порядку, индекс, созданный с помощью enumerate
, также является относительной позицией фрагмента в исходных данных.