Как изолировать суммы в долларах с помощью Regex?

Я использовал библиотеку PDFPlumber для извлечения всех строк в моем PDF-файле, образец экстракта строки выглядит так:

Итого возврат на транспорт $ 16,01

Цель состоит в том, чтобы поместить все это во фрейм данных. Как использовать регулярное выражение для группировки этой строки, чтобы я мог изолировать тип начисления и сумму в долларах?

В настоящее время у меня есть:

      totals=re.compile(r"(\ATotal) ([\w]+) ([\w]*)")
for line in text.split("\n"):
    line2=totals.search(line)
    if line2:
        print(line)
        print(line2.group(1))
    else:
        pass

Группа 1 возвращает «Итого», группа 2 возвращает «Возврат», а группа 3 - «Транспортировка», но я не могу создать группу, которая извлекает сумму в долларах. Какие-либо предложения?

Примечание. Суммы в долларах, превышающие 1000 долларов США, содержат символ ",", который может потребоваться включить в синтаксис регулярного выражения.

2 ответа

Просто измените свое регулярное выражение так:

      totals=re.compile(r"(\ATotal) ([\w]+) ([\w]*) ([\$ ]+?(\d+([,\.\d]+)?))")
>>> totals.search("Total Return Transportation $16.01").group(4)
'$16.01'
>>> totals.search("Total Return Transportation $1,006.01").group(4)
'$1,006.01'

Вы можете использовать шаблон с 4 группами захвата.

Обратите внимание, что вы можете написать [\w] как просто \w.

С использованием \w* соответствует необязательным символам слова и, возможно, также может соответствовать пустой строке.

Вы можете сопоставить символы слова 1+ раз и использовать шаблон для суммы в долларах, соответствующий 1-3 цифрам слева и необязательным частям запятой и 3 цифрам между ними.

      \A(Total) (\w+) (\w+) (\$\d{1,3}(?:,\d{3})*(?:\.\d+)?)(?!\S)
  • \A Начало строки
  • (Total) Захватить тотал в группе 1 и сопоставить пробел
  • Захватите более 1 символа слова в группе 2 и сопоставьте пробел
  • (\w+) Захватите более 1 символа слова в группе 3 и сопоставьте пробел
  • (Группа захвата 4
    • \$\d{1,3} Матч $ и 1-3 цифры
    • (?:,\d{3})*(?:\.\d+)? При желании повторить 3 цифры и при желании сопоставить . и 1+ цифр
  • ) Закрыть группу 4
  • (?!\S) Установите границу пробела справа, чтобы предотвратить частичное совпадение

См. Демонстрацию регулярного выражения и демонстрацию Python.

      import re
 
strings = [
    "Total Return Transportation $16.01",
    "Total Return Transportation $123,899,116.01",
    "Total Return Transportation $1612.01"
]
 
pattern = r"\A(Total) (\w+) (\w+) (\$\d{1,3}(?:,\d{3})*(?:\.\d+)?)(?!\S)"
 
for s in strings:
    match = re.match(pattern, s)
    if match:
        print(match.group(4))

Выход

      $16.01
$123,899,116.01
Другие вопросы по тегам