You only check the turn at the end of the match, which means that he can match the string as much as possible, and then check the back. Since you don’t have at the end of the line [[, the match is successful.
, , , :
>>> s = 'hello world! [[A string typically used in programming examples]]'
>>> regex = re.compile('(?P<question>((?!\[\[).)+)')
>>> regex.match(s).group('question')
'hello world! '
, - s.find('[[') .