Шаблон, который я бы использовал: ((\d+)(?!.*\d).*)engineer
- он ищет последнюю цифру и идет оттуда.
Нечто подобное (\d.*)engineer
также будет работать, но только если в строке будет только одна цифра.
>>> import re
>>> string = '123 abc mysql 23 rufos kanso engineer'
>>> pattern = r'((\d+)(?!.*\d).*)engineer'
>>> re.search(pattern, string).group(1)
'23 rufos kanso '
>>>
Редактировать
Если после части 'Engineer' есть цифры, шаблон, упомянутый выше, не работает, как вы указали в комментарии,Я пытался решить ее, но, честно говоря, я не смог придумать новый шаблон (извините).
Обходной путь, который я мог бы предложить, это предположить, что «инженер» по-прежнему является «ключевым» словом, разбивая вашу исходную строку по указанному слову.
Вот иллюстрация того, что я имею в виду:
>>> string = '123 abc mysql 23 rufos kanso engineer 1234 b65 de'
>>> string.split('engineer')
['123 abc mysql 23 rufos kanso ', ' 1234 b65 de']
>>> string.split('engineer')[0]
'123 abc mysql 23 rufos kanso '
# hence, there would be no unexpected digits
>>> s = string.split('engineer')[0]
>>> pattern = r'((\d+)(?!.*\d).*)'
>>> re.search(pattern, s).group(1)
'23 rufos kanso '