Доступ к нескольким строкам из текста с помощью регулярного выражения и итерации в python - PullRequest
1 голос
/ 28 апреля 2020

У меня есть текстовый файл, который конвертируется из PDF-файла счета / заказа. Мне нужно извлечь детали продукта из него с помощью регулярного выражения. Проблема, с которой я сталкиваюсь, заключается в том, что я могу легко выделить одну деталь продукта. Однако, так как несколько счетов анализируются (не за один раз), я не могу предсказать количество продуктов, которые будут присутствовать в счете. Итак, как мне определить, сколько продукта будет в наличии, пройтись по нему и взять все детали продукта.

Ниже приведен пример текста счета-фактуры с одним продуктом:

Item SKU Product Desc. Qty UOM 
1 _L180.0001352879 Clam Tuatua Medium 20- 1.00 cs
34pc/Kg 15kg/CS

Ниже приведен продукт с несколькими продуктами:

Item SKU Product Desc. Qty UOM
1 L465.0001354266 Yoghurt Passionfruit Organic 4.00 PC
Vegan 1kg
2 L465.0001354264 Yoghurt Plain Organic Vegan 4.00 PC
1kg

Теперь регулярное выражение и код, который я использую для этого, приведены ниже:

line_match = re.compile(r'UOM\s\d\s+([\w.]+)\s([\w\s\-]+[\s])([0-9.]+)\s([\w]+)\n([\w\/\s]+[\n])')

line = line_match.search(text)

print("Product description : " + line.group(2) + line.group(5))
print("Quantity : " + line.group(3))

1 Ответ

1 голос
/ 01 мая 2020

Вы можете использовать модуль регулярных выражений PyPi и использовать якорь \G для получения итеративных совпадений.

Pattern

(?:UOM\s|\G(?!^))\d\s+([\w.]+)\s([\w\s-]+\s)([0-9.]+)\s(\w+)\n([\w/\s]+\n)
  • (?: Группа без захвата
    • UOM\s Сопоставить UOM и символ пробела
    • | Или
    • \G(?!^) Задать позицию в конце предыдущего матча, а не в начале
  • ) Закрыть группу
  • \d\s+ Совпадение с ди git и 1+ пробелами
  • ([\w.]+)\s Захват группа 1 Совпадение символов или точек слова и пробела
  • ([\w\s-]+\s) Захват группы 2 Совпадение слов / символов пробела или - и окончание whitespa c char
  • ([0-9.]+)\s Capture group 3 Match цифры или . и символ пробела
  • (\w+)\n Capture group 4 Совпадение слов и символов новой строки
  • ([\w/\s]+\n) Захват группа 5 Совпадение слов / пробельных символов или / и символ новой строки

Regex demo | Python демо

Пример кода

import regex

pattern = r"(?:UOM\s|\G(?!^))\d\s+([\w.]+)\s([\w\s-]+\s)([0-9.]+)\s(\w+)\n([\w/\s]+\n)"

test_str = ("Item SKU Product Desc. Qty UOM\n"
            "1 _L180.0001352879 Clam Tuatua Medium 20- 1.00 cs\n"
            "34pc/Kg 15kg/CS\n\n\n\n"
            "Item SKU Product Desc. Qty UOM\n"
            "1 L465.0001354266 Yoghurt Passionfruit Organic 4.00 PC\n"
            "Vegan 1kg\n"
            "2 L465.0001354264 Yoghurt Plain Organic Vegan 4.00 PC\n"
            "1kg\n\n\n")


matches = regex.finditer(pattern, test_str)

for matchNum, match in enumerate(matches, start=1):
    print("Product description : " + match.group(2) + match.group(5))
    print("Quantity : " + match.group(3))

Выход

Product description : Clam Tuatua Medium 20- 34pc/Kg 15kg/CS
Quantity : 1.00
Product description : Yoghurt Passionfruit Organic Vegan 1kg
Quantity : 4.00
Product description : Yoghurt Plain Organic Vegan 1kg
Quantity : 4.00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...