Can someone please explain why these expressions both produce the same result? Surely this means that non-greedy regex does not work? print re.sub( 'a.*b', '', 'ababc' ) gives: 'c' Understandable. But print re.sub( 'a.*?b', '', 'ababc' ) gives: 'c' NOT, understandable. Surely the answer should be: 'abc'