def extract_ingredient_parts(ingredient_string): """ Extracts the unit, quantity, base ingredient, and modifiers from an item in a recipe's ingredient list. Returns a dictionary, or None if nothing could be parsed. Simple examples: >>> extract_ingredient_parts('12 cups lettuce') {'base_ingredient': 'lettuce', 'unit': 'cups', 'quantity': '12'} >>> extract_ingredient_parts("14 large, fresh eggs") {'base_ingredient': 'egg', 'modifiers': 'large, fresh', 'quantity': '14'} More complex quantities: >>> extract_ingredient_parts('1 1/2 tbsp olive oil') {'base_ingredient': 'olive oil', 'unit': 'tbsp', 'quantity': '1 1/2'} >>> extract_ingredient_parts('1 (12 ounce) package tofu') {'base_ingredient': 'tofu', 'unit': '(12 ounce) package', 'quantity': '1'} Modifiers that appear after ingredients: >>> extract_ingredient_parts('apple, cored, peeled') {'base_ingredient': 'apple', 'modifiers': 'cored, peeled'} TODO: handle separators like ' - ' and parentheses. Invalid ingredient strings: >>> extract_ingredient_parts('1 1/2') == None True """ try: parsed = ingredient_line.parseString(ingredient_string) except pyparsing.ParseException: return None parts = {} if 'quantity' in parsed: parts['quantity'] = parsed['quantity'].strip() if 'unit' in parsed: parts['unit'] = parsed['unit'].strip() parts['base_ingredient'] = \ normalize_ingredient_name(parsed['base_ingredient']) if 'pre_modifiers' in parsed or 'post_modifiers' in parsed: parts['modifiers'] = '' if 'pre_modifiers' in parsed: parts['modifiers'] = parsed['pre_modifiers'].strip() if 'post_modifiers' in parsed: if 'pre_modifiers' in parsed: parts['modifiers'] += ', ' + parsed['post_modifiers'].strip() else: parts['modifiers'] = parsed['post_modifiers'].strip() return parts
def from_text(text): parsed = {} try: parsed = ingredient_line.parseString(text) except ParseException as e: print("Could not parse the ingredient line: {0}".format(text)) amount = parsed['quantity'] if 'quantity' in parsed else None ingredient = parsed['base_ingredient'] if 'base_ingredient' in parsed else None unit = parsed['unit'] if 'unit' in parsed else None modifier = parsed['modifier'] if 'modifier' in parsed else None post_modifier = parsed['post_modifier'] if 'post_modifier' in parsed else None return Ingredient(amount, ingredient, unit, modifier, post_modifier, text)