Pyparsing включает в себя адаптивное выражение, очень похожее на это, называемое counttedArray. counttedArray (expr) анализирует начальное целое число 'n', а затем анализирует 'n' экземпляров выражения expr, возвращая весь массив в виде одного списка. Это работает так, что countedArray анализирует ведущее целочисленное выражение, за которым следует неинициализированное выражение Forward. К выражению, являющемуся ведущим целым числом, прикреплено действие синтаксического анализа, которое назначает следующий Forward для 'n' * expr. Затем анализатор pyparsing продолжает работу и анализирует следующий 'n' expr. Так что это своего рода самоизменяющийся парсер.
Для анализа вашего выражения это будет выглядеть примерно так:
integer = Word(nums).setParseAction(lambda t:int(t[0]))
following = Forward()
integer.addParseAction(lambda t: following << Word(printables+" ",exact=t[0]))
H_expr = integer + 'H' + following
print H_expr.parseString("22HThis is a test string.This is not in the string")
Печать:
[22, 'H', 'This is a test string.']
Если у Ply есть что-то похожее, возможно, вы могли бы использовать эту технику.