Guck Dir mal hier
http://docs.python.org/library/re.html#regular-expression-syntax
den *? Operator an, da steht was greedy und nongreedy bedeuten.
Prinzipiell sucht eine Regular Expression so lange, bis jeder Teil des
Musters seine Entsprechung gefunden hat. Das bedeutet normal aber nicht,
dass die gesamte Eingabe davon abgedeckt werden muss.
Dein Muster besteht aus zwei Teilen, die jeweils (fast) beliebige Länge
haben dürfen:
und
(Ok, der 2. Teil kann niemals aus einem oder zwei Zeichen bestehen, aber
Null und >= 3 sind erlaubt.)
Wenn du sie auf non-greedy stellst, wird jedes dieser Muster versuchen,
einen möglichst kurzen Teil in deiner Eingabe zu finden, so dass das
Gesamtergebnis passt. Der kürzeste mögliche String, der hier erlaubt
ist, ist leer.
Durch die '^' und '$' forderst du zusätzlich, dass dein Muster die
gesamte Eingabe (bzw die ganze Zeile wenn es mehrere sind) abdeckt, also
muss jedes Zeichen in der Eingabe auch eine Entsprechung im Muster
finden, also sind 2 Strings der Länge 0 nicht mehr zulässig. Daher
muss sich deine linke Seite so weit ausdehnen, dass die Rechte Seite
den Rest übernehmen kann und das kann sie nur wenn ein ' : ' im String
vorkommt.
Der '^' ist bei Python deshalb nicht notwendig, weil die Funktion match
immer ab dem Beginn der Eingabe sucht. Das bedeutet, dass du immer ein
implizites '^' vorne dran hast, wenn du match benutzt.