Я пытаюсь проанализировать результат распознавания Google для квитанции в структурированном YAML / JSON.
Например, рассмотрим квитанцию с такими атрибутами:
- SKU
- Название товара
- Итоговая цена
- Количество и цена за единицу
- Депозит в контейнере
И пример сканирования квитанции двухв корзине:
Вот результат распознавания:
1438 # captain's SKU
CAPTAIN MORGAN WHITE 1X1.14L # captain's item name
66.98 G # captain's subtotal
2 @ 33.49 # captain's quantity and price per item
Container Deposit # ignore this
773143 # cazadores's SKU
CAZADORES BLANCO 1X750ml # cazadores's item name
0.40 # captain's container deposit value (it strangely shows here)
159.95 G # cazadores's subtotal
5 @ 31.99 # cazadores's quantity and price per item
Container Deposit # ignore this
0.50 # cazadores's container deposit value
Проблема заключается в том, что контейнерный депозит капитана неправильно упорядочено (т.е. оно охватывает строку следующего элемента). Такого рода неупорядоченные упорядоченные строки встречаются повсюду.
Каков наилучший способ точного анализа с помощью регулярных выражений?
Что я пробовал: у меня есть несколько регулярных выражений для каждого атрибута, например:
regex_library = {
'sku': re.compile(r'\n(\d{3,})\n[A-Z]{2}'),
'subtotal_and_tax_type': re.compile(r'(\d+.\d+) (G)'),
'description': [
re.compile(r'[A-Z- \']{5,50}\d[xX]\d+\.\d+L'), # for pattern like 1x1.14L, like CAPTAIN MORGAN WHITE 1X1.14L'
re.compile(r'[A-Z0-9- \']{5,50}\d[xX]\d+[Mm][Ll]\n'), # for pattern that ends with ml, like 'CAZADORES BLANCO 1X750ml\n' 'EL JIMADOR BLANCO 1X750mL\n'
re.compile(r'[A-Z0-9- \']{5,50}\d[xX]\d+[Mm]\n'), # for missing the 'l' on 'ml', like "ROAD13 HONEST JOHN'S ROSE 1X750m\n", 'CAPTAIN MORGAN - SPICED 1X750m\n'
],
'container_deposit': re.compile(r'[01]\.\d0'),
'quantity_unit_price': [
re.compile(r'\d+ @ \d+\.\d\d'), # for normal one, like ['2 @ 29.99']
re.compile(r'\d+ \d+\.\d\d'), # for missing @, like ['3 48.49', '4 31.99']
re.compile(r'\n\d{4}[\.,]\d\d\n'), # for no space and dot is acted like comma, like ['1220,49', '\n1216.49\n']
],
}
При подходе, подобном описанному выше, я получил список каждого атрибута, например:
- список SKU
- список имени элемента
- и так далее
Затем я объединил его с zip
, чтобы выполнить итерацию одновременно и сформировать его в класс отдельного элемента.
Проблема в том, что вывод OCR настолько дикийчто мне очень трудно добавить / проверить новое регулярное выражение. Мне кажется, что я нашел определенно работающий шаблон регулярных выражений, но он просто не работает на новом OCR-результате другого получения и так далее. А когда произошел сбой одного шаблона, итерация zip
также не удастся, и я пропущу один или несколько элементов.
Опять же: Каков наилучший способ точного анализа этих данных с помощью регулярного выражения?