Search code examples
pythonregexpython-re

Return all the occurrences from a string as a list in python using regular expression


Suppose I have a string like this:

exp = 'CASE WHEN  "Expressions"."PRODUCT_CATEGORIES"."CATEGORY_NAME"=\'CPU\'  THEN   \'YES\'  WHEN  "Expressions"."PRODUCT_CATEGORIES"."CATEGORY_NAME"=\'RAM\'  THEN   \'YES\' ELSE  \'NO\' END' 

I want to return the text between WHEN and THEN in all occurrences.

This is the expected output

['"Expressions"."PRODUCT_CATEGORIES"."CATEGORY_NAME"=\'CPU\'',
 '"Expressions"."PRODUCT_CATEGORIES"."CATEGORY_NAME"=\'RAM\'']

What I have tried is this:

res = re.findall(r'\s*(WHEN|When|when)+\s*(.*)\s*(THEN|Then|then)+\s*')

But the resulting list shows this output in my case

['(WHEN  "Expressions"."PRODUCT_CATEGORIES"."CATEGORY_NAME"=\'CPU\'  THEN   \'YES\'  WHEN  "Expressions"."PRODUCT_CATEGORIES"."CATEGORY_NAME"=\'RAM\'  THEN)']

Solution

  • Make it non-greedy with ?:

    re.findall("when *(.+?) *then", exp, re.I)
    

    Output:

    ['"Expressions"."PRODUCT_CATEGORIES"."CATEGORY_NAME"=\'CPU\'',
     '"Expressions"."PRODUCT_CATEGORIES"."CATEGORY_NAME"=\'RAM\'']