Вот ключевая функция, которая должна иметь возможность обрабатывать более или менее любую строку:
>>> import itertools
>>>
>>> def key_fun(s):
... return (*(("",) if s and s[0].isdecimal() else ()), *(int(''.join(g)) if k else ''.join(g) for k, g in itertools.groupby(s, str.isdecimal)),)
Демонстрация (добавлено несколько случайных строк, которые не следуют шаблону):
>>> pprint(sorted(list_of_dwg + ['', '45', 'e'], key=key_fun))
['',
'45',
'\\\\pc_name\\AHL-4604-0002-1_FRONT COVER.dwg',
'\\\\pc_name\\AHL-4604-0002-2_MASTER LIST.dwg',
'\\\\pc_name\\AHL-4604-0002-3_LEGEND LIST.dwg',
'\\\\pc_name\\AHL-4604-0002-4.dwg',
'\\\\pc_name\\AHL-4604-0002-10.dwg',
'\\\\pc_name\\AHL-4604-0002-11A.dwg',
'e']
Вот что делает ключевая функция.Он группируется по десятичному / не десятичному типу и преобразует десятичные блоки.Одна проблема заключается в том, что мы должны всегда начинать с одного и того же вида блока, потому что Python3 не любит сравнивать числа и строки.Я решил добавить пустую строку, если первый символ десятичный.Как следствие, все, что начинается с числа, предшествует всему, что начинается с не числа.
>>> key_fun(list_of_dwg[0])
('\\\\pc_name\\AHL-', 4604, '-', 2, '-', 10, '.dwg')