Это работает для вас примеры
Код
def parse(s):
""" Splits on successive digits,
then takes everything up to last split on digits """
return ''.join(re.split(r'(\d+)', s)[:-2])
Тесты
Использование указанных строк
for t in ['this_is-a.string-123-with.number',
'this_is-a123.456string-123-with.number',
'one-0more-str.999']:
print(f'{parse(t)}')
Вывод
this_is-a.string-
this_is-a123.456string-
one-0more-str.
Пояснение
Строка
s = 'this_is-a123.456string-123-with.number'
Разделить на группу цифр
re.split(r'(\d+)', s)
Out: ['this_is-a', '123', '.', '456', 'string-', '123', '-with.number']
Оставить последние два элемента в разбиении
re.split(r'(\d+)', s)[:-2] # [:-2] slice dropping last two items of list
Out: ['this_is-a', '123', '.', '456', 'string-']
Объединить список в строку
''.join(re.split(r'(\d+)', s)[:-2]) # join items
Out: this_is-a123.456string-