Какие регулярные выражения python использовать?

Прогоняю строки через регулярное выражение для обрезания, строка кода

k = (s[:s.find('(')] + s[s.rfind(';')] + s[s.rfind('-') + 1:-1])

Строка, которая у меня получается

{'price': '<script type="text/javascript">document.write;icon_top_2_iphone"></span>
Безопасная сделка</a> 10&nbsp;000&nbsp;₽ </div>\');</script'}

Мне нужно вытащить из строки

10&nbsp;000&nbsp;₽

Не могу допереть как дальше двигаться


Ответы (1 шт):

Автор решения: Wiktor Stribiżew

Используйте

import re, ast, html
s = r"""{'price': '<script type="text/javascript">document.write;icon_top_2_iphone"></span>Безопасная сделка</a> 10&nbsp;000&nbsp;₽ </div>\');</script'}"""
d = ast.literal_eval(s)
m = re.search(r'(?<!\d)\d{1,3}(?:\xA0\d{3})*\s*₽', html.unescape(d["price"]))
if m:
    print( m.group() ) # => 10 000 ₽

См. пример работы кода в Python

ast.literal_eval(s) конвертирует строку в словарный объект. Нужная нам строка содержится в d["price"].

html.unescape(d["price"]) конвертирует HTML-сущности в их буквальное представление, например, &nbsp в неразрывный пробел.

Регулярное выражение (?<!\d)\d{1,3}(?:\xA0\d{3})*\s*₽ найдёт 1-3 цифры, потом 0 и более повторов неразрывного пробела + 3 цифр, потом 0 и более пробельных символов, а затем символ , перед которыми нет другой цифры.

→ Ссылка