Если некоторые части могут отсутствовать, вы можете сделать все группы необязательными, за исключением формата файла, если он должен присутствовать.
Поскольку пробелов нет, вы можете добавить к шаблону положительный знак lookahead ^(?=\S+\.\w+$)
, чтобы подтвердить хотя бы один символ без пробелов, соответствующий группе file_format
.
Примечание, чтобы избежать точки \.
, чтобы соответствовать ей буквально
^(?=\S+\.\w+$)(?P<name>[a-zA-Z0-9]+)?(?P<limit>_\d+K)?(?P<code>_[a-zA-Z0-9]+)?(_[a-zA-Z0-9]+)?(_[a-zA-Z0-9]+)?(_[a-zA-Z0-9]+)?(_[a-zA-Z0-9]+)?\.(?P<file_format>\w+)$
Regex demo
Если все части могут быть необязательными, вы можете утверждать символ слова и сделать необязательными всю часть в конце строки, включая точку.
^(?=\w)(?P<name>[a-zA-Z0-9]+)?(?P<limit>_\d+K)?(?P<code>_[a-zA-Z0-9]+)?(_[a-zA-Z0-9]+)?(_[a-zA-Z0-9]+)?(_[a-zA-Z0-9]+)?(_[a-zA-Z0-9]+)?(?:\.(?P<file_format>\w+))?$
Regex demo
Edit В соответствии с предложением @ JvdV , вы можете немного сократить шаблон, используя квантификатор для захвата всех значений дополнительных групп захвата в одну группу:
^(?=\w)(?P<name>[a-zA-Z0-9]+)?(?P<limit>_\d+K)?(?P<code>_[a-zA-Z0-9]+)?((?:_[a-zA-Z0-9]+){0,4})(?:\.(?P<file_format>\w+))?$
Regex demo