Como iterar corretamente com re.sub () em Python

Eu quero fazer um script Python que cria notas de rodapé. A ideia é encontrar todas as strings do tipo"Some body text.{^}{Some footnote text.}" e substituí-los por"Some body text.^#", Onde"^#" é o número correto da nota de rodapé. (Uma parte diferente do meu script lida com as notas de rodapé na parte inferior do arquivo.) O código atual que estou usando para isso é:

pattern = r"\{\^\}\{(.*?)\}"
i = 0
def create_footnote_numbers(match):
   global i
   i += 1
   return "<sup>"+str(i)+"</sup>"

new_body_text = re.sub(pattern, create_footnote_numbers, text)

Isso funciona bem, mas parece estranho ter que declarar uma variável (i) fora dacreate_footnote_numbers função e, em seguida, tem que chamá-lo dentro dessa função. Eu teria pensado que haveria algo dentrore que retornaria o número da partida.

questionAnswers(3)

yourAnswerToTheQuestion