Как мне записать цену с разделителем в тысячу и десятичную дробь с помощью регулярного выражения в python

#python #regex #matching #re

Вопрос:

В настоящее время у меня работает код, но единственным недостатком является то, что я не установил код python для регулярных выражений оптимальным образом.

Исходный текст содержит сумму в тысячах, сотнях тысяч и миллионах. Без десятичной дроби. Я имею в виду, что он имеет десятичное число, но всегда «, 00».

Пример строки в тексте:

Долг 1 из 2 на сумму: $ 58.610,00, неоплаченный

Прямо сейчас следующий код фиксирует миллионы штрафов, но менее 100 000 пропускает одну цифру.

 regex = r"(d ).(d ).(d ),(d )"
            match = re.search(regex, line, re.MULTILINE)
            print = "$" match.group(1) match.group(2) match.group(3)
 

Это захватывает вот так:

$5860

Но цель такая:

$58610

Если сумма указана в миллионах, она фиксируется нормально, мне пришлось сделать это так, потому что валюта, с которой я работаю, имеет большие суммы. Поэтому я постоянно управляю такими количествами.

С уважением

Ответ №1:

Вы можете использовать следующее регулярное выражение для извлечения ожидаемых совпадений и последующего удаления разделителя тысяч:

 $s?(d{1,3}(?:.d{3}) )(?:,d )?(?!d)
 

Вам нужно получить значение группы 1, удалить из него точки и повторно ввести $ в начале. Смотрите демонстрацию регулярных выражений. Подробные сведения:

  • $ $ символ
  • s? — необязательный пробел
  • (d{1,3}(?:.d{3}) ) — Группа 1: от одной до трех цифр, а затем одно или несколько вхождений (поскольку вы хотите сопоставить только тысячи и более) . и три цифры
  • (?:,d )? — необязательная последовательность запятой и одной или нескольких цифр
  • (?!d) — сразу справа не допускается ни одна цифра.

Смотрите демонстрацию Python:

 import re
text = 'Debt 1 of 2 for an amount of: $ 58.610,00, Unpaid'
match = re.search(r'$s?(d{1,3}(?:.d{3}) )(?:,d )?(?!d)', text)
if match:
    print(f"${match.group(1).replace('.', '')}")

# => $58610
 

Комментарии:

1. Ты мужик! Это работает идеально! Большое вам спасибо. Я ценю это