Вы можете использовать свое текущее регулярное выражение ([a-z])\1(\d)(\d)(?=[a-z])
и заменить его следующим:
<\1>\1<\2><\3>
Regex Demo
Вы можете изменитьваш код для использования re.sub
и получения ожидаемого результата.
import re
data = "aa11bb123cc3333dd12eeeff3"
regex = re.compile(r"([a-z])\1(\d)(\d)(?=[a-z])")
print(re.sub(regex, r'<\1>\1<\2><\3>', data))
Печать так, как вы ожидали,
<a>a<1><1>bb123cc3333<d>d<1><2>eeeff3
Кроме того, когда вы обновили свой пост, просто уточнив, что это регулярное выражение (\d)*
имеет только одну группу, и это не значит, что *
вне группы, и это сделает число групп кратным.(\d)*
будет вести себя так же, как \d*
, за исключением того, что захваченная цифра в группе будет только одна и точно последняя найденная цифра.