Вы можете использовать следующее выражение:
\b(?P<key>[A-Z][A-Z ]+)\b(?P<value>\d+(?:\.\d+)?)
Затем нам нужно очистить ключи (удалить ненужные пробелы) и подумать о функции, которая возвращает значение для данного ключа. Необязательно: поместите все в класс. Тем не менее, код может быть:
import re
class Finder:
def __init__(self, haystack):
self.db = self.build_db(haystack)
def build_db(self, haystack):
rx = re.compile(r'\b(?P<key>[A-Z][A-Z ]+)\b(?P<value>\d+(?:\.\d+)?)')
ws = re.compile(r'\s+')
return {ws.sub(' ', m["key"].strip()): m["value"] for m in rx.finditer(haystack)}
def find_by_key(self, key):
try:
value = self.db[key]
except KeyError:
value = None
return value
def get_selected(self, lst):
result = {}
for key in lst:
value = self.find_by_key(key)
if value:
result[key] = value
return result
def get_all(self):
return self.db
cls = Finder(junk)
dct = cls.get_selected(["NEUTROPHILS", "LYMPHOCYTES", "MONOCYTES", "EOSINOPHILS", "BASOPHILS"])
print(dct)
, что даст
{'NEUTROPHILS': '93.4', 'LYMPHOCYTES': '3.3',
'MONOCYTES': '3.1', 'EOSINOPHILS': '0.2', 'BASOPHILS': '0.0'}
См. Демонстрацию выражения на regex101.com .