Почему не работает так, как нужно?
Все как раз работает как надо.
[ ] и | имеют специальное значение в регексе. Если нужны именно символы таких, их нужно экранировать с помощью \

re.compile('\[(.+)\|(.+)\]')
Какой прикольный смайл получился...
('[(.+)|(.+)]')