Regex разделяет строки с numeri c char и последующими значениями в Python - PullRequest
0 голосов
/ 18 июня 2020

Имея этот список значений:

['Champiñón 200 g',
'Zapallo italiano Unid.',
'Bolsa de zanahoria 1 kg',
'Papa malla 2 Kg',
'Palta Hass granel',
'Limón malla 1 kg',
'Tomate granel',
'Brócoli 1 un.',
'Tomate  unid']

Как можно разделить этот список с помощью re.split () для получения этой формы:

['Champiñón' , '200 g',
'Zapallo italiano' , 'Unid.',
'Bolsa de zanahoria' ,'1 kg',
'Papa malla' ,'2 Kg',
'Palta Hass granel',
'Limón malla' ,'1 kg',
'Tomate granel',
'Brócoli' ,'1 un.',
'Tomate'  ,'unid']

Ответы [ 2 ]

1 голос
/ 18 июня 2020

Вы можете сделать что-то вроде этого:

import re

data = ['Champiñón 200 g',
'Zapallo italiano Unid.',
'Bolsa de zanahoria 1 kg',
'Papa malla 2 Kg',
'Palta Hass granel',
'Limón malla 1 kg',
'Tomate granel',
'Brócoli 1 un.',
'Tomate  unid']


splitted = []

for line in data:
    value, unit, *_ = *re.split(' ((\d|unid).*)', line, flags=re.IGNORECASE), ''

    splitted.append(value)

    if unit:
        splitted.append(unit)

print(splitted)
1 голос
/ 18 июня 2020

В ситуациях синтаксического анализа split() обычно лучше всего работает, когда вы хотите выбросить данные, которые вы разделяете. Но вы хотите сохранить его, поэтому вам, вероятно, лучше использовать подход захвата.

import re

orig_vals = [
    'Champiñón 200 g',
    'Zapallo italiano Unid.',
    'Bolsa de zanahoria 1 kg',
    'Papa malla 2 Kg',
    'Palta Hass granel',
    'Limón malla 1 kg',
    'Tomate granel',
    'Brócoli 1 un.',
    'Tomate  unid',
]

# We will capture the two parts of interest and
# only throw away a space in the middle. This regex is
# not super robust, but it does work correctly for the
# example data you have supplied.
rgx = re.compile('(.+) ((\d|unid).*)', re.IGNORECASE)

new_vals = []
for ov in orig_vals:
    m = rgx.search(ov)
    new_vals.extend([m.group(1).rstrip(), m.group(2)] if m else [ov])

И если вы действительно хотите использовать разбиение, вы можете написать более сложное регулярное выражение, используя предварительный просмотр - чтобы предотвратить потребление и, таким образом, выбрасывание текста, который мы разбиваем.

rgx2 = re.compile('(.+?) +(?=\d|unid)', re.IGNORECASE)

new_vals2 = [
    part
    for ov in orig_vals
    for part in rgx2.split(ov)
    if part
]
...