Ну, сначала я подумал, что это не удалось, потому что я посмотрел на возвращаемые группы:
>>> tw = re.compile(r"^((@\w*)\s+)*")
>>> tw.findall(tweet)
[('@michelle ', '@michelle')]
>>> tw.match(tweet).groups()
('@michelle ', '@michelle')
Обратите внимание, что группы сохраняют только последнее значение для любой группы в re. Но если вы просто захватите group (), вы получите всю совпадающую строку:
>>> tw.match(tweet).group()
'@patrick @michelle '
За ухмылки попробую разобраться:
>>> from pyparsing import Word, printables, OneOrMore
>>> atName = Word("@",printables)
>>> OneOrMore(atName).parseString(tweet).asList()
['@patrick', '@michelle']