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

У меня есть список строк, и я хочу разбить каждую строку на число с плавающей запятой. Если в строке нет числа с плавающей запятой, я хочу разделить его на число. Он должен делиться только один раз и возвращать все до и после, разделенные запятыми.

Входная строка:

['Naproxen  500  Active ingredient  Ph Eur',
 'Croscarmellose sodium  22.0 mg Disintegrant  Ph Eur',
 'Povidone K90  11.0   Binder 56 Ph Eur',
 'Water, purifieda,
 'Silica, colloidal anhydrous  2.62  Glidant  Ph Eur',
 'Water purified 49 Solvent  Ph Eur',
 'Magnesium stearate  1.38  Lubricant  Ph Eur']

Ожидаемый результат:

['Naproxen',  '500',  'Active ingredient  Ph Eur',
 'Croscarmellose sodium',  '22.0 mg',  'Disintegrant  Ph Eur',
 'Povidone K90',  '11.0',  'Binder  Ph Eur',
 'Water, purifieda',
 'Silica, colloidal anhydrous',  '2.62',  'Glidant  Ph Eur',
 'Water purified', '49',  'Solvent  Ph Eur',
 'Magnesium stearate',  '1.38',  'Lubricant  Ph Eur']

Мой код:

for i in newresult:
        regex_float_part = re.split(r'\s+(\d+\.\d+)\s+', i, 1)
#        print(regex_float_part)
#        regex_float_part_n = [item for sublist in regex_float_part for item in sublist]
        if regex_float_part:
            all_extract.append(regex_float_part)
        else:
#            regex_integer = r'\s+(\d+(?:\\d+)?)\s+'
            regex_integer_part = re.split(r'\s+(\d+(?:\\d+)?)\s+', i, 1)
#            regex_integer_part_n = [item for sublist in regex_integer_part for item in sublist]


            all_extract.append(regex_integer_part)

Проблема с этой входной строкой:

'Water purified 49 Solvent  Ph Eur',

Это не так, как ожидалось:

'Water purified', '49',  'Solvent  Ph Eur'

, то есть код не собирается в остальную часть. Одно наблюдение состоит в том, что функция разбиения моего регулярного выражения создает список списков, то есть regex_float_part и regex_integer_part являются списком списков. Может кто-нибудь, пожалуйста, помогите мне решить эту проблему для строки, на которую мой код не отвечает

Ответы [ 2 ]

0 голосов
/ 04 февраля 2020

Я предлагаю использовать

res = re.match(r'^(?:(?!.*\d\.\d)(.*?)\s*\b(\d+(?:\s*mg)?)\b\s*(.*)|((?:(?!\d+\.\d).)*?)\s*\b(\d+\.\d+(?:\s*mg)?)\b\s*(.*))$', i)
if res:
    all_extract.append(list(filter(None, res.groups())))

См. Демо regex .

Full Python демо без комментария кода :

import re

def show():
    newresult = ['Naproxen  500  Active ingredient  Ph Eur','Croscarmellose sodium  22.0 mg Disintegrant  Ph Eur','Povidone K90  11.0   Binder 56 Ph Eur','Water, purifieda','Silica, colloidal anhydrous  2.62  Glidant  Ph Eur','Water purified 49 Solvent  Ph Eur','Magnesium stearate  1.38  Lubricant  Ph Eur']
    all_extract = []
    for i in newresult:
        res = re.match(r'^(?:(?!.*\d\.\d)(.*?)\s*\b(\d+(?:\s*mg)?)\b\s*(.*)|((?:(?!\d+\.\d).)*?)\s*\b(\d+\.\d+(?:\s*mg)?)\b\s*(.*))$', i)
        if res:
            all_extract.append(list(filter(None, res.groups())))
        else:
            print("ONLY INTEGER")
            regex_integer_part = re.split(r'\s+(\d+(?:\.\d+)?)\s+', i, 1)
            all_extract.append(regex_integer_part)
    return all_extract

print(show())

выход

[['Naproxen', '500', 'Active ingredient Ph Eur'], ['Croscarmellose sodium', '22.0 mg', 'Disintegrant Ph Eur'], ['Povidone K90', '11.0', 'Binder 56 Ph Eur'], ['Water, purifieda'], ['Silica, colloidal anhydrous', '2.62', 'Glidant Ph Eur'], ['Water purified', '49', 'Solvent Ph Eur'], ['Magnesium stearate', '1.38', 'Lubricant Ph Eur']]

0 голосов
/ 04 февраля 2020

Ваше регулярное выражение почти правильно, но вы должны принять во внимание, что . и цифры после точки могут отсутствовать. Это может быть достигнуто следующим образом:

\s+(\d+(?:\.\d+)?)\s+

Разница в том, что вы добавляете \.\d+ в группу без захвата (?:xxxx), которая может быть там или не быть там, используя знак вопроса после группа: (?:xxxx)?

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