I'm not sure I like the idea of parsing templates with regular expressions. There is a better way, as demonstrated in Robe Pike's video[1] detailing how the Go template language is implemented.
Edit: which isn't meant to detract from the fact that this is a great article.
Great blog post! I did something very similar when I was working on an implementation of the Mustache templating language. If you haven't built a simple recursive descent parser already, I highly recommend doing so — it helped me get a lot better at programming.
I was particularly interested in building parsers a short while back, and your post rekindled my interest.
So, in the interest of sharing I thought I'd mention a couple of interesting libraries I came across.
In Ruby I think Temple (https://github.com/judofyr/temple) is really quite cool. It's designed to make creating templating languages really easy, and constructs ASTs using user-defined parsers.
And even more interesting in my opinion is Haskell's Parsec (http://www.haskell.org/haskellwiki/Parsec). It uses combinators to build up parsers, and can produce friendly parse error messages "for free."
Interesting extension of this exercise would be to replace your custom AST with the AST exposed by Python, then use the compile() builtin to compile said AST into a PyCodeObject ready for direct execution by the Python VM. :)
Also, this page maintains links to many python parsing options - http://nedbatchelder.com/text/python-parsers.html