Ot, taki znak, że nie umarłem. Dziś w programie dość popularny błąd składu, choć wielu uważa, że internetu reguły nie dotyczą. A sierotki wykończymy tak:

import re

def sierotki(text):
    reg = re.compile(u'\\b(a|i|o|u|w|z)\\b\\s+')
    return reg.sub(u'\\1\u00a0', text)

Niestety, na ogół mamy do czynienia z tekstem zawierającym znaczniki:

import re
from BeautifulSoup import BeautifulSoup

def sierotki(text):
    soup = BeautifulSoup(text)
    reg = re.compile(u'\\b(a|i|o|u|w|z)\\b\\s+')
    for val in soup.findAll(text=reg):
        val.replaceWith(reg.sub(u'\\1\u00a0', val))
    return unicode(soup)

I na koniec bonus, blok dla Django:

from django import template
register = template.Library()

@register.tag(name='sierotki')
def do_sierotki(parser, token):
    nodelist = parser.parse(('endsierotki',))
    parser.delete_first_token()
    return SierotkiNode(nodelist)

class SierotkiNode(template.Node):
    def __init__(self, nodelist):
        self.nodelist = nodelist
    def render(self, context):
        output = self.nodelist.render(context)
        return sierotki(output)