def getnote(notes):
    for note in re.split('\\r?\\n\\[\\*\\]: ', notes)[1:]:
        yield '\\footnote{{{}}}'.format(note)
note = getnote(notes)
res = re.sub('\\[\\*\\]', lambda m: next(note), text)
Регулярное выражение Python соответствует только один раз