Я вот так реализовал бы:
def get_long_format(short_format_list):
short_format_list = list(short_format_list)
result = []
while short_format_list:
e = short_format_list.pop(0)
if isinstance(e, (tuple, list)):
buf = list(e[:-1] * e[-1])
buf.extend(short_format_list)
short_format_list = buf
else:
rep = {"s":str, "f":float, "i":int}
result += [(int(e[:-1]), rep[e[-1]])]
return result
def get_by_format(s, long_format):
result = []
i = 0
for k, f in long_format:
result.append(f(s[i:i+k]))
i += k + 1
return result
>> sformat = ("2i", "6s", ("2s", "6f", 4), "2s", "6s")
>> lformat = get_long_format(sformat)
>> lformat
[(2, <class 'int'>), (6, <class 'str'>), (2, <class 'str'>), (6, <class 'float'>), (2, <class 'str'>), (6, <class 'float'>), (2, <class 'str'>), (6, <class 'float'>), (2, <class 'str'>), (6, <class 'float'>), (2, <class 'str'>), (6, <class 'str'>)]
>> s = "12 аа ааа бб 12.456 вв 00.000 гг 00.000 дд 00.000 ее 00.000"
>> get_by_format(s, lformat)
[12, 'аа ааа', 'бб', 12.456, 'вв', 0.0, 'гг', 0.0, 'дд', 0.0, 'ее', '00.000']
Разбил что бы промежуточный результат было видно.
Интересно увидеть регуляркой.