s = """This is a note[*] and this is another[*]
[*]: note 1
[*]: note 2"""
[text, notes] = re.split('((?:\\r?\\n\\[\\*\\]:[^\\r\\n]*)+$)', s)[:-1]

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)
print(res)
Регулярное выражение Python соответствует только один раз