Проблема очень похожа на найденную в другом вопросе SO .
Решение состоит в том, чтобы создать частичную грамматику, которая анализирует структуру распознанной конструкции, пропуская то, что не может быть распознано.
В вашем случае, используя textX , это было бы что-то вроде этого (я не проверял это, но вы получите изображение):
from textx import metamodel_from_str
mm = metamodel_from_str(r'''
File: ( /(?s:.*?(?=NAME))/ persons*=Person | 'NAME' )*
/(?s).*/;
Person:
'NAME' first_name=Name last_name=Name birth_date=Date
'ADDRESS-1' address_1=UntilEOL
'ADDRESS-2' address_2=UntilEOL
'CITY' city=UntilEOL
;
Name: /\w+/;
Date: /\d{4}-\d{2}-\d{2}/;
UntilEOL[noskipws]: /.*?\n/;
''')
data_model = mm.model_from_file('some_input_file.txt')
# Here data_model is an object with attribute `persons`
# where each person have attributes `first_name`, `last_name`, ...
# from the `Person` rule above.
Примечание. В этом решении предполагается, что в начале структурной части должно быть ключевое слово NAME
, но ключевое слово можно найти в случайных данных, так как при неправильном разборе правила Person
парсер будет использовать слово NAME
и продолжить.
В зависимости от ваших реальных данных вам придется немного настроить грамматику (например, определенные регулярные выражения).