Вы можете использовать группы захвата с обратными ссылками в запасной части:
s = re.sub(r'(\.SYSCOP)([0-9]{2})(\.D%%ODATE)', r'\3\1.#\2', s)
См. Демоверсию regex
Каждый \X
в шаблоне замены относится к N-м скобкам в шаблоне, поэтому вы можете изменить значение соответствия в соответствии с вашими потребностями.
Обратите внимание, что .
должен быть экранирован, чтобы соответствовать буквальной точке.
Обратите внимание на необработанный строковый литерал, префикс r
перед строковыми литералами помогает избежать чрезмерной обратной косой черты. '\3\1.#\2'
- это не то же самое, что r'\3\1.#\2'
, вы можете print
строковые литералы и посмотреть сами. Короче говоря, внутри необработанных строковых литералов escape-последовательности строк, такие как \a
, \f
, \n
или \r
, не распознаются, а обратная косая черта рассматривается как буквенная обратная косая черта, только та, которая используется для построения regex escape-последовательности (обратите внимание, что r'\n'
и '\n'
обе соответствуют новой строке, поскольку первая - escape-последовательность регулярного выражения, совпадающая с новой строкой, а вторая - буквальный символ LF.)