Преобразование строки в список нужных токенов с использованием python

У меня есть ингредиенты для тысяч продуктов, например:

Ingredient = 'Beef stock (beef bones, water, onion, carrot, beef meat, parsnip, thyme, parsley, clove, black pepper, bay leaf), low lactose cream (28%), onion, mustard, modified maize starch,tomato puree, modified potato starch, butter sugar, salt (0,8%), burnt sugar, blackcurrant, peppercorns (black, pink, green, all spice, white) 0,4%.'

Я хочу, чтобы этот ингредиент был представлен в виде списка:

listOfIngredients = ['Beef Stock', 'low lactose cream', 'onion', 'mustard', 'modified maize starch','tomato puree', 'modified potato starch', 'butter sugar', 'salt', 'burnt sugar', 'blackcurrant', 'peppercorns']

Таким образом, в listOfIngredients у меня нет никаких объяснений продукта в процентах или даже дополнительных продуктах, которые содержит один ингредиент. Regex - хороший способ сделать это, но я не умею делать регулярное выражение. Может кто-то помочь мне в создании регулярного выражения, чтобы получить желаемый результат. Заранее спасибо.

python,regex,

1

Ответов: 1


Вы можете попробовать два подхода.

Первый из них - удалить все (подстроки и все, что не )после (за которым не следует граница без слов (.

[^()]*

См. Демо-версию regex

Детали :

  • ( - 0+ пробелы
  • )- [^...]подстрока, не имеющая [^,]*и )внутри:
    • , - буквальный (
    • (?:,[^,]*)*- символы 0+ кроме (и )(a ,- отрицательный класс символов )
  • [^,]* - символы 0+, кроме ,
  • ,s* - ноль или несколько последовательностей:
    • _ - запятая, за которой следует буква / цифра / подчеркивание
    • (...)- 0+ символов, кроме .([^()]*)|([^Wd]+(?:s+[^Wd]+)*)

Эти совпадения удаляются, а затем ([^()]*)регулярное выражение используется для разделения строки с запятой и 0+ пробелами, чтобы получить окончательный результат.

Второй из них основан на сопоставлении и захвате слов, состоящих только из букв (и _), и только для (...)подстановки подстрок.

(

См. Вторую демо-версию regex

Детали :

  • )- |подстрока, не имеющая (и )внутри
  • ([^Wd]+(?:s+[^Wd]+)*) - или
  • [^Wd]+ - Сбор группы 1:
    • _- 1+ буквы или символы подчеркивания (вы можете добавить _после dисключения подчеркивания)
    • (?:s+[^Wd]+)* - 0+ последовательностей:
      • s+ - 1 или более пробелов
      • [^Wd]+ - 1 + буквы или символы подчеркивания

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

См. Демонстрацию Python :

import re
Ingredient = 'Beef stock (beef bones, water, onion, carrot, beef meat, parsnip, thyme, parsley, clove, black pepper, bay leaf), low lactose cream (28%), onion, mustard, modified maize starch,tomato puree, modified potato starch, butter sugar, salt (0,8%), burnt sugar, blackcurrant, peppercorns (black, pink, green, all spice, white) 0,4%.'
res = re.sub(r's*([^()]*)[^,]*(?:,[^,]*)*', "", Ingredient)
print(re.split(r',s*', res))

vals = re.findall(r'([^()]*)|([^Wd]+(?:s+[^Wd]+)*)', Ingredient)
vals = [x for x in vals if x]
print(vals)
питон, регулярное выражение,