Если вы передадите функцию, вы потеряете автоматический c выход из обратных ссылок. Вы просто получаете объект соответствия и должны выполнять работу. Таким образом, вы могли бы:
Выбрать строку в регулярном выражении, а не передавать функцию:
text = "abcdef"
pattern = "(b|e)cd(b|e)"
repl = [r"\1bla\2", r"\1blabla\2"]
re.sub(pattern, random.choice(repl), text)
# 'abblaef' or 'abblablaef'
Или написать функцию, которая обрабатывает объект сопоставления и допускает более сложную обработку. Вы можете воспользоваться expand
для использования обратных ссылок:
text = "abcdef abcdef"
pattern = "(b|e)cd(b|e)"
def repl(m):
repl = [r"\1bla\2", r"\1blabla\2"]
return m.expand(random.choice(repl))
re.sub(pattern, repl, text)
# 'abblaef abblablaef' and variations
Вы можете, или, конечно, поместить эту функцию в лямбду:
repl = [r"\1bla\2", r"\1blabla\2"]
re.sub(pattern, lambda m: m.expand(random.choice(repl)), text)