Вообще, «(.+)(?P< volume>\d+)?(\s?шт)?$» чтобы выдернуть число — это перебор. Зачем такое сложное выражение?
m = re.search('(\d+)[\s]?шт', 'Коробка шт с кирпичами 10 шт;')
m.group(1)
(Это моя первая в жизни программа на Python, но я её честно протестил перед тем, как публиковать.)Edit: более конкретизированная регулярка, которая не реагирует на слова, вроде: «штукатурка», «штанга» и прочие, начинающиеся со «шт»:
(\d+)[\s]?шт([^а-яА-я]|$)