Извлечение информации из необработанного текста - PullRequest
1 голос
/ 10 февраля 2020

Описание проблемы

Вот текстовый шаблон, который у меня есть:

05.04.0090
1


erhältlichen Tableau Interfaces
lassen sich zusätzliche GLT-Kontakte
aufschalten. Das System kann

die zwei Szenarien-Modi "Urlaub" und
Abwesenheit" verwalten. Für beide
Modi können bestimmte Parameter
programmiert werden.

Das WAREMA climatronic Bediengerät
kann preisgleich auch

in den Farben "schwarz" oder
"schwarz/silber" geliefert werden.
Liefern und montieren. 882,75 882,75

В приведенном выше текстовом блоке есть item_code, в котором есть эта норма для записи 05.04.0090 затем внизу идет подсчет элемента 1, затем следует description of product, затем unit price в этом случае EU 882,75 и в итоге итоговое значение sum, равное 882,74

Что я хочу Я хочу сделать из него пары ключ-значение, например dict[{'item_code':'5.04.009','quant':'1','description':'TEXT','unit_price':'882,74','Total_sum':'88,75'}]

В конце я буду использовать этот шаблон в просторе для распознавания сущностей. Любое предложение относительно простоты было бы также замечательно

Что я пробовал?

pat= re.search(r'\d(.*?)\d',text,re.M)
print(pat.group())

Помощь или предложение будут оценены.

1 Ответ

1 голос
/ 10 февраля 2020

Для вывода используется функция pprint.pprint . Для объяснения используемого регулярного выражения, пожалуйста, go до RegEx101 .

import re
import pprint

data = '''
05.04.0090
1


erhältlichen Tableau Interfaces
lassen sich zusätzliche GLT-Kontakte
aufschalten. Das System kann

die zwei Szenarien-Modi "Urlaub" und
Abwesenheit" verwalten. Für beide
Modi können bestimmte Parameter
programmiert werden.

Das WAREMA climatronic Bediengerät
kann preisgleich auch

in den Farben "schwarz" oder
"schwarz/silber" geliefert werden.
Liefern und montieren. 882,75 882,75


05.04.0091
100
foo bar. 170,42 17042
'''

rx = r'''(?mx)
^
(?P<item_code>\d\d\.\d\d\.\d{4})
\s+
(?P<quantity>\d+)
\s+
(?P<description>\S[\s\S]*?)
[ ]+
(?P<unit_price>\d+(?:,\d\d)?)
[ ]+
(?P<total_sum>\d+(?:,\d\d)?)
$
'''
result = [m.groupdict() for m in re.finditer(rx, data)]
pprint.pprint(result)

Выход:

[{'description': 'erhältlichen Tableau Interfaces\n'
                 'lassen sich zusätzliche GLT-Kontakte\n'
                 'aufschalten. Das System kann\n'
                 '\n'
                 'die zwei Szenarien-Modi "Urlaub" und\n'
                 'Abwesenheit" verwalten. Für beide\n'
                 'Modi können bestimmte Parameter\n'
                 'programmiert werden.\n'
                 '\n'
                 'Das WAREMA climatronic Bediengerät\n'
                 'kann preisgleich auch\n'
                 '\n'
                 'in den Farben "schwarz" oder\n'
                 '"schwarz/silber" geliefert werden.\n'
                 'Liefern und montieren.',
  'item_code': '05.04.0090',
  'quantity': '1',
  'total_sum': '882,75',
  'unit_price': '882,75'},
 {'description': 'foo bar.',
  'item_code': '05.04.0091',
  'quantity': '100',
  'total_sum': '17042',
  'unit_price': '170,42'}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...