Вашему регулярному выражению необходимо разрешить конец строки and
или с квантификатором lazy . В вашем регулярном выражении .*
является жадным и будет пытаться сопоставить самую длинную строку до конца строки.
Следующее регулярное выражение должно работать для вас:
r'^.*foo=(.*?)(?:\sand|$)'
Вот полный код:
>>> s1 = 'quz=1, 2, 3 and foo=4, 5, 6 and bar=7, 8, 9'
>>> s2 = 'quz=1, 2, 3 and foo=4, 5, 6'
>>> p = r'^.*foo=(.*?)(?:\sand|$)'
>>> print re.findall(p, s1)
['4, 5, 6']
>>> print re.findall(p, s2)
['4, 5, 6']