Вы можете получить три результата, сделав класс [*#]
необязательным. (Также обратите внимание, что эти символы не нужно экранировать.)
str = '10S#9D7T*'
rex = re.compile(r'\d?\d\w?[*#]?')
print(rex.findall(str))
Результат: ['10S#', '9D', '7T*']
Что касается вашего второго правила: «И следовать за одним символом всегда находится», вы, вероятно, захотите сделать \w
необязательным, удалив ?
сразу после него.
r'\d?\d\w[*#]?'