Как правильно получить цену из строки - PullRequest
1 голос
/ 15 апреля 2019

Настройка

Я собираю информацию о ценах на продукты с помощью Selenium и Python 3.x.

У меня есть список строк, которые содержат цену каждого продукта.

Для цен ниже € 1000 строки выглядят как '€ 505.93 net' (т.е. 505.93).Для цен от € 1000 строки выглядят как '€ 1 505.93 net' (т.е. 1505.93).


Задача

Я не уверен, как аккуратноразобраться с пространством в тысячах цен и точками.

Пусть product_price = '€ 1 505.93 net', тогда

[int(s) for s in product_price if s.isdigit()]

дает,

[1, 5, 0, 5, 9, 3]

Аналогичная процедура на product_price = '€ 505.93 net' дает [5, 0, 5, 9, 3].


Вопрос

Как настроить мой код таким образом, чтобы я получал 1505.93 и 505.93?

Ответы [ 3 ]

4 голосов
/ 15 апреля 2019

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

€\s*(\d{1,3}(?: \d{3})*(?:\.\d+)?)

Тогда первая группа захвата должна содержать соответствующие суммы в евро.

input = '€ 1 505.93 net and here is another price € 505.93'
result = re.findall(r'€\s*(\d{1,3}(?: \d{3})*\.\d+)', input)
print list(result)

['1 505.93', '505.93']

Объяснение регулярного выражения:

€                  a Euro sign
\s*                followed by optional whitespace
(                  (capture what follows)
    \d{1,3}        one to three digits
    (?: \d{3})*    followed by zero or more thousands groups
    (?:\.\d+)?     an optional decimal component
)                  (close capture group)
1 голос
/ 15 апреля 2019

Для этого нужно использовать регулярное выражение:

import re
pattern = r'((?:\d\s)?\d+\.\d+)'
re.findall(pattern, '€ 1 505.93 and € 505.93')
>>['1 505.93', '505.93']

Пояснение:

  • \d представляет собой цифру

    \s представляет собой пробел

    ?: нотация - это запись группы без захвата

    ? для указания необязательных групп

So

(?:\d\s)?

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

\d+.\d+ указывает число с плавающей запятой

0 голосов
/ 15 апреля 2019

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

import re

def bar(string):
    return float(''.join(re.findall(r"[\d.]", string)))

a = '€ 1 505.93 net'
b = '€ 505.93 net'

print(bar(a))
print(bar(b))

Вывод:

1505.93
505.93

Если вы также хотите обрабатывать запятые, для региональной совместимости вы можете использовать replace (), чтобы поменять его на период:

def bar(string):
    return float(''.join(re.findall(r"[\d.,]", string)).replace(',', '.'))

c = '€ 6 812,51 net'
print(bar(c))

Вывод:

6812.51
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...