У меня есть список строк, которые происходят из переменной newresult
в моем коде ниже. Пример:
['Naproxen 500 Active ingredient Ph Eur',
'Croscarmellose sodium 22.0 Disintegrant Ph Eur',
'Povidone K90 11.0 mg Binder Ph Eur',
'Water, purifieda',
'Silica, colloidal anhydrous 2.62 % Glidant Ph Eur',
'Magnesium stearate 1.38 Lubricant Ph Eur',
'Hypromellose 3 mPas 5.10 Film former Ph Eur 20%']
Отсюда я хочу получить из строки все значения (названия лекарств), которые присутствуют перед десятичным числом. Если в строке не найдено десятичное число, я хочу получить все значения (названия лекарств) перед числом. Если числа нет, я хочу получить названия лекарств от регулярных выражений. Если есть какие-либо процентные данные, я хочу, чтобы они были отдельной сущностью. Итак, я хочу 4 вещи из каждой строки,
Medicine name- name of the medicine
Dosage - The decimal value in the string. If no decimal value, then dosage is the number value in the string
Activity- Remaining part of the string without medicine name and dosage.
Dosage percentage - Any number/decimal with percentage attached to it.
Ожидаемый результат:
Medicine name Dosage All Role Dosage Percentage
Naproxen 500 Active ingredient Ph Eur
Croscarmellose sodium 22.0 Disintegrant Ph Eur
Povidone K90 11.0 mg Binder Ph Eur
Water, purifieda
Silica, colloidal anhydrous Glidant Ph Eur 2.62%
Magnesium stearate 1.38 Lubricant Ph Eur
Hypromellose 3 mPas 5.10 Film former Ph Eur 20%
Код до сих пор:
file = open(r'C:\Users\lat.csv', 'r')
oo=csv.reader(file)
allsub = []
for line in oo:
allsub.append(line)
medicines = [item for sublist in allsub for item in sublist]
files = open(r'C:\Users\1060099.csv', 'r')
oos=csv.reader(files)
allrole = []
for line in oos:
allrole.append(line[2])
allrole = list(set(allrole))
allrole.remove('Active')
def tableextract(filename):
file=open(filename, encoding ='utf8')
file=file.read()
result = []
med = r"(?:{})".format("|".join(map(re.escape, medicines)))
pattern = re.compile(r"^\s*" + med + r".*(?:\n[^\w\n]*\d*\.?\d+(?:\s*[dkm]g|kg|ml|q\.s\.|gm|µg)?[^\w\n]*(?:\n.*){2})?", re.M|re.IGNORECASE)
result = pattern.findall(file)
results = [item.replace("\t", " ") for item in result]
resultsn = [item.replace("\xa0", " ") for item in results]
nresults = [item.replace("\n", " ") for item in resultsn]
newresult = []
for line in nresults:
newresult.append((line.strip()))
med_reg = r"({})".format("|".join(map(re.escape, medicines)))
pattern_med = re.compile(r"^\s*" + med_reg + r".*(?:\n[^\w\n]*\d*\.?\d+(?:\s*[dkm]g|kg|ml|q\.s\.|gm|µg)?[^\w\n]*(?:\n.*){2})?", re.M|re.IGNORECASE)
medicine_only = []
for matcher in pattern_med.finditer(file):
medicine_only.append(matcher.group(1))
Проблема связана с этой частью кода ниже:
Rx = r"(?i)(?=.*?((?:\d+(?:\.\d*)?|\.\d+)\s*(?:mg|kg|ml|q\.s\.|gm|µg)))?(?=.*?(\d+(?:\.\d+)?\s*%))?(?=.*?((?:\d+(?:\.\d*)?|\.\d+))(?![\d.])(?!\s*(?:%|mg|kg|ml|gm|q\.s\.|µg)))?.+"
final = []
for s in medicine_only:
for e in newresult:
match = re.search( Rx, e )
if e.upper().startswith(s.upper()):
if match.group(1) and match.group(2):
final.append([s,match.group(1), match.group(2), e])
elif match.group(2) and match.group(3):
final.append([s,match.group(3), match.group(2), e])
elif match.group(1):
final.append([s,match.group(1),'', e])
elif match.group(2):
final.append([s,'',match.group(2), e])
else:
if match.group(3):
#ee = match.group(3)
if isinstance(match.group(3), float):
final.append([s,match.group(3),'', e])
res = []
for sub in final:
new_sub = sub
agent_found = False
for ag in allrole:
if agent_found:
break
for item in sub:
if ag.lower() in item.lower():
new_sub = [ag] + new_sub
agent_found = True
break
if not agent_found:
new_sub = [" "] + new_sub
res.append(new_sub)
return res
Возвращается либо нулевое значение, либо только несколько значений, а не все значения из newresult
, которые должны иметь сделанный. Ожидаемый результат не получается отсюда. Может кто-нибудь помочь мне исправить эту часть кода или получить ожидаемый вывод из списка ввода строки без исправления этой части кода