Неправильно отрабатыват шаблон textFSM, непонимаю где ошибка

Рейтинг: 0Ответов: 1Опубликовано: 19.05.2023

Обрабатываю счета от операторов связи, в тексте множество строк вида

Абонент 79026297995 Профи (Салехард NEW)
Ежемесячные услуги
Абонплата 93,00 руб
Итого начисления 93,00 руб
Абонент 79026294403 Профи (Салехард NEW)
Начисления за вызовы
SMS/MMS 1253 шт 2 004,80 руб
Прочие звонки 5мин 0,00 руб
Итого начисления 2 004,80 руб
Абонент 79026290083 Профи (Салехард NEW)
Начисления за вызовы
Прочие звонки 205 мин 0,00 руб
Итого начисления 0,00 руб

файл шаблона:

Value ABON (\d+)
Value RUB (.+)

Start
  ^Абонент\s${ABON}
  ^Итого начисления\s${RUB}\sруб  -> Record

на regex101 проверяю, первая строка однозначно определяет номер абонента, вторая сумму Итого но textFSM возвращает все строки с пустой суммой вида ['79924098795', '']

Ответы

▲ 0Принят

Будем считать это "фантазией на тему"

поскольку я не знаком с библиотекой textFSM и не знаю конечной задачи то попробую решить задачу стандартным re.

import re
text = """Абонент 79026297995 Профи (Салехард NEW)
Ежемесячные услуги
Абонплата 93,00 руб
Итого начисления 93,00 руб
Абонент 79026294403 Профи (Салехард NEW)
Начисления за вызовы
SMS/MMS 1253 шт 2 004,80 руб
Прочие звонки 5мин 0,00 руб
Итого начисления 2 004,80 руб
Абонент 79026290083 Профи (Салехард NEW)
Начисления за вызовы
Прочие звонки 205 мин 0,00 руб
Итого начисления 0,00 руб"""

dict(re.findall(r'Абонент (\d+).+?Итого начисления (.+?)(?=\n|\Z)', text, flags=re.S))

{'79026297995': '93,00 руб',
 '79026294403': '2 004,80 руб',
 '79026290083': '0,00 руб'}

или так

re.findall(r'Абонент (\d+).+?(\w.+?)\n.+?Итого начисления (.+?)(?=\n|\Z)', text, flags=re.S)

[('79026297995', 'Профи (Салехард NEW)', '93,00 руб'),
 ('79026294403', 'Профи (Салехард NEW)', '2 004,80 руб'),
 ('79026290083', 'Профи (Салехард NEW)', '0,00 руб')]