Регулярное выражение большого объема для количества и цен в финансах

#python #regex #price #product-quantity

#python #регулярное выражение #Цена #продукт-количество

Вопрос:

Я выполняю некоторый интеллектуальный анализ огромного количества финансовых данных, и мне нужно найти два регулярных выражения python, которые соответствуют:

Цены, такие как:

 16 666 666.67
16 666 666,67
666 666.67
5 567.1
5 677,1
0.0
0,101
5,4
5.40
54.0
5.675674754747457
5980990.009345
16,000.45
234,234,657.108
  

В цене всегда есть кома или точка. Но перед coma могут быть пробелы (пробелы должны быть последовательными, не как, 56 34.345 например)

Объем (количество), такой как:

 9898
5
450934
5,000
1,000
1,000,000
5,998
11
0
5 000
1 000 000
1 980 000 000
599
233 590
23 613
181 876 980
  

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

Вот то, которое я пробовал для цен: (^[0-9]{0,}$)|(d{1,}(?:[.,]d{3})*(?:[.,]d*)) Но я не могу обрабатывать пробелы.

Что касается объема, для меня это очень сложно, поскольку везде также есть пробелы!

Большое вам спасибо.

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

1. Каков ваш «желаемый» результат?

2. Есть ли какой-то контекст вокруг этих чисел в строке, из которой вы пытаетесь сопоставить выражение, или вы получаете числа точно так же, как в ваших примерах? Если есть еще что-то, то было бы неплохо узнать, чтобы помочь.

3. @FailSafe Логическое значение в порядке, лучше использовать весь объем или количество, насколько это возможно!

4. @TheKvist Там могло быть ( или что-то приклеено, да

5. В ценах некоторые из десятичных разделителей с запятой, а некоторые из них разделители цифр?

Ответ №1:

В этом случае я бы рекомендовал немного больше, чем просто регулярное выражение.

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

 if '.' not in line:
    # `,` is our separator, so replace with `.`
    line = line.replace(',', '.')
else:
    # `.` is our separator, so replace `,` with ` ` (does nothing if already space separated).
    line = line.replace(',', ' ')
  

Теперь мы можем применить регулярное выражение к line :

^d{1,3}(sd{3})*.d $ сопоставит все, что разделено тысячами. ^d .d $ будет соответствовать чему угодно без разделения на тысячи.

Обратите внимание, что, поскольку мы провели небольшую предварительную обработку строк, наше регулярное выражение стало намного проще. Я оставлю для вас количество (должно быть проще) и захват соответствующих фрагментов.

Я бы также рекомендовал захватить всю строку, а затем вызвать .replace(' ', '') для удаления пробелов, вместо того, чтобы пытаться удалить их внутри регулярного выражения.

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

1. Я воспользуюсь предложенным вами методом и попробую вернуться с хорошей функцией. Спасибо

2. конечно, дайте мне знать, если это сработает (и если это сработает, пожалуйста, примите этот ответ).

3. конечно, дай мне немного времени, чтобы попробовать это!