К сожалению, re.escape()
не подходит для строки замены:
>>> re.sub('a', re.escape('_'), 'aa')
'\\_\\_'
Решение состоит в том, чтобы поместить замену в лямбду:
>>> re.sub('a', lambda _: '_', 'aa')
'__'
, поскольку возвращаемое значение лямбды обрабатывается re.sub()
как буквенная строка.