Обработка строки и поиск значения в ней
Есть текст такого формата в формате строки
Оборот: 473 051 ( 333 337 )
Основа: 429 961 ( 223 333 )
Аксы: 43 090 ( 100 000 )
Услуги: 0 ( 4 )
Сервис: 0 ( 10 000 )
CPU: 1 ( 1 )
iPad: 1 ( 1 )
iPhone: 2 ( 2 )
Watch: 0 ( 1 )
SIM: 0 1
Средний чек: 43 005 ( 37 000 )
Штуки в чеке: 1,73 ( 1,6 )
Доля аксов: 9,1% ( 17% )
Конвертация: 4,1% ( 12% )
Трафик 268
СБП 91,34 ( 30% )
Нужен примерно следующий функционал: при запросе например 'Основа' вытащить 429 961 и ( 223 333 ) и вычислить процент Итог примерно такой Основа : 192% На данный момент есть код который с этим справляется, но через кучу костылей и далеко не самый изящный)))
Ответы (2 шт):
Автор решения: CameL
→ Ссылка
import re
txt = """Оборот: 473 051 ( 333 337 )
Основа: 429 961 ( 223 333 )
Аксы: 43 090 ( 100 000 )
Услуги: 0 ( 4 )
Сервис: 0 ( 10 000 )
CPU: 1 ( 1 )
iPad: 1 ( 1 )
iPhone: 2 ( 2 )
Watch: 0 ( 1 )
SIM: 0 1
Средний чек: 43 005 ( 37 000 )
Штуки в чеке: 1,73 ( 1,6 )
Доля аксов: 9,1% ( 17% )
Конвертация: 4,1% ( 12% )
Трафик 268
СБП 91,34 ( 30% )"""
a = txt.split('\n') # Разбиение текста на строки
for el in a:
el = el.replace(' ','') # Удалиение пробелов
el = el.replace(',','.') # Замена запятых на точки
s = [float(s) for s in re.findall(r'-?\d+\.?\d*', el)] # Выборка чисел
key = el[:el.find(':')] # Выборка заголовка
try:
print(f"{key} {s[0]/(s[1]/100)} %")
except:
print(f"{key} Нехватает данных")
Могу такое решение предложить, с построчным перебором, удалением лишних символом, и выборкой чисел при помощи регулярного выражения
Автор решения: CrazyElf
→ Ссылка
Ещё один вариант разбора, не идеальный, но как заготовка. Разбираю сразу в словарь и поиск уже из словаря идёт, чтобы быстро.
import re
text = """
Оборот: 473 051 ( 333 337 )
Основа: 429 961 ( 223 333 )
Аксы: 43 090 ( 100 000 )
Услуги: 0 ( 4 )
Сервис: 0 ( 10 000 )
CPU: 1 ( 1 )
iPad: 1 ( 1 )
iPhone: 2 ( 2 )
Watch: 0 ( 1 )
SIM: 0 1
Средний чек: 43 005 ( 37 000 )
Штуки в чеке: 1,73 ( 1,6 )
Доля аксов: 9,1% ( 17% )
Конвертация: 4,1% ( 12% )
Трафик 268
СБП 91,34 ( 30% )"""
d = {}
re1 = re.compile(r'([^:\d]+):?([\d, ]+%?)\D*([\d, ]+%?)')
for line in text.split('\n'):
m = re1.match(line)
if m:
name = m[1].strip()
num1 = m[2].strip().replace(' ', '').replace(',','.').replace('%','')
num2 = m[3].strip().replace(' ', '').replace(',','.').replace('%','')
print(f'{name}:{num1}/{num2}')
d[name.lower()] = 100*float(num1)/float(num2) if num2 else 'ошибка парсинга'
while True:
name = input().lower()
if not name:
break
print(d.get(name, 'не найдено'))