Обработка строки и поиск значения в ней

Есть текст такого формата в формате строки

Оборот:  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, 'не найдено'))
→ Ссылка