#python #regex
Вопрос:
Я читал в разделе цены на некоторые товары. Как вы увидите ниже, не все строки ценообразования на товары настроены одинаково. То, что я пытаюсь сделать,-это разобрать подстроки, которые мне не нужны.
Ниже приведен код, который у меня есть, который работает, но для этого должен быть более эффективный способ.
tmp1 = p_pricing.replace("from ", "")
tmp1 = tmp1.replace("Options Available on Open Box", "")
tmp1 = tmp1.replace("Open Box Price: From ", "")
tmp1 = re.sub(r'([^)]*)', '', tmp1)
tmp1 = re.split("[$]", tmp1)
Ниже приведен небольшой образец моей ценовой строки:
$11.99($6.00 per item)$14.99
from $13.99$18.25
$9.89($4.94 per item)$14.99
from $9.83($3.28 per item)
from $15.99$29.99
from $84.99$104.95
from $9.83($3.28 per item)
$3.47
$94.99$129.99
from $14.34$19.90
from $25.01$65.00Options Available on Open Box
Ответ №1:
Похоже, вы просто хотите получить числовые значения всех цен в каждой строке.
Вы можете использовать
re.findall(r'$(d (?:.d )?)', text)
Смотрите демонстрацию регулярных выражений.
Подробные сведения
$
— а$
чар(d (?:.d )?)
— Захват группы 1: одна или несколько цифр, а затем необязательное вхождение a.
и одной или нескольких цифр.
Смотрите демонстрационную версию Python:
import re
pattern = r"$(d (?:.d )?)"
text = "$11.99($6.00 per item)$14.99nfrom $13.99$18.25n$9.89($4.94 per item)$14.99nfrom $9.83($3.28 per item) nfrom $15.99$29.99nfrom $84.99$104.95nfrom $9.83($3.28 per item) n$3.47n$94.99$129.99nfrom $14.34$19.90nfrom $25.01$65.00Options Available on Open Box"
print( re.findall(pattern, text) )
Выход:
['11.99', '6.00', '14.99', '13.99', '18.25', '9.89', '4.94', '14.99', '9.83', '3.28', '15.99', '29.99', '84.99', '104.95', '9.83', '3.28', '3.47', '94.99', '129.99', '14.34', '19.90', '25.01', '65.00']
Ответ №2:
Поскольку вы заменяете скобки » от » и «открытие» до «закрытие» в своем коде ([^)]*)
с помощью пустой строки, вы можете получить все цены за пределами скобок, сопоставив их с открывающей скобкой до закрывающей скобки.
Затем используйте чередование |
и захватите то, что вы хотите сохранить.
Цифры находятся в группе захвата 1.
([^()]*)|$(d (?:.d ))
([^()]*)
Совпадение от открывающей до закрывающей скобки|
Или$
Соответствует знаку доллара(d (?:.d ))
Группа захвата 1 Соответствует 1 цифрам и необязательной десятичной части
Смотрите демонстрацию регулярных выражений или демонстрацию Python
Пример кода
import re
pattern = r"([^()]*)|$(d (?:.d ))"
s = "$11.99($6.00 per item)$14.99 from $13.99$18.25 $9.89($4.94 per item)$14.99 from $9.83($3.28 per item) from $15.99$29.99 from $84.99$104.95 from $9.83($3.28 per item) $3.47 $94.99$129.99 from $14.34$19.90 from $25.01$65.00Options Available on Open Box"
print([s for s in re.findall(pattern, s) if s])
Выход
['11.99', '14.99', '13.99', '18.25', '9.89', '14.99', '9.83', '15.99', '29.99', '84.99', '104.95', '9.83', '3.47', '94.99', '129.99', '14.34', '19.90', '25.01', '65.00']