re.sub(r'(?:_a)?\.([^.]*)$', r'_suff.\1', "long.file.name.jpg")
?:
запускает группу без соответствия ( SO answer ), поэтому(?:_a)
соответствует_a
, но не перечисляет его, следующий вопросительный знак делает его необязательным.Итак, по-английски, это говорит, что конец
.
, следующий за (или не), шаблон_a
Другой способ сделать это - использовать lookbehind ( см. здесь ). Упомя все это, потому что они очень полезны, но я не знал о них за 15 лет работы с REs