Example #1
0
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 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
Example #3
0
 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)