Если вы хотите заменить 3 или 4 цифры, за которыми следуют пробел с той же цифрой, за которой следует подчеркивание, правильный синтаксис / замена регулярного выражения будет:
re.sub(r"([0-9]{3,4})\s", r"\1_", s)
Возможно, вы неправильно прочитали, как работают группы / обратные ссылки. То, что должно быть в группе, должно быть в скобках. Если вы хотите использовать именованную группу (что немного не нужно):
re.sub(r"(?P<dig>[0-9]{3,4})\s", r"\g<dig>_", s)
Или с предварительно скомпилированным регулярным выражением, похожим на ваш пример:
s = "7053 MyFile.pptx"
p = re.compile(r"(?P<dig>[0-9]{3,4})\s")
print(p.sub('\g<dig>_', s))
{3,4}
после [0-9]
означает три или четыре матча. \s
обозначает пробел (не просто пробел).
На самом деле просто поиск 3 цифр, как написано, также будет соответствовать 4 цифрам, потому что мы не ограничиваем то, что происходит до сопоставления с шаблоном. В зависимости от того, что вы ищете, вы можете ограничить совпадения, добавив к шаблону ^
(начало строки) или \b
пустой символ на краю слова ...