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