Получить все значения до десятичного числа из списка строк в Python - PullRequest
1 голос
/ 04 февраля 2020

У меня есть список строк, которые происходят из переменной 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, которые должны иметь сделанный. Ожидаемый результат не получается отсюда. Может кто-нибудь помочь мне исправить эту часть кода или получить ожидаемый вывод из списка ввода строки без исправления этой части кода

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...