Во-первых, ваш шаблон неверен - он соответствует всему от первого <
до последнего >
, что явно не то, что вы хотите. Во-вторых, for i in sentence
не имеет смысла - итерация по строке дает вам одиночные символы строки, которые в любом случае не будут соответствовать вашему шаблону.
Это, однако, похоже на то, что вы хотите:
return re.sub('<i>(.*?)</i>', r'\1 \1', sentence)
\1
является ссылкой на любую первую группу захвата, ie. (.*?)
, соответствует, и используется дважды для достижения эффекта удвоения.