Как изолировать суммы в долларах с помощью 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