Попробуйте это:
^(?:([^@/<>'\"]+)@)?([^@/<>'\"]+)(?:/([^<>'\"]*))?$
Это не вполне правильно, так как есть много вещей, которые соответствуют ему, которые не являются действительными JID, особенно в части доменного имени. Однако он должен разрешить и проанализировать все действительные JID, причем группа 1 является узлом, группа 2 является доменом, а группа 3 является ресурсом.
Данные испытаний:
foo (None, 'foo', None)
foo@example.com ('foo', 'example.com', None)
foo@example.com/bar ('foo', 'example.com', 'bar')
example.com/bar (None, 'example.com', 'bar')
example.com/bar@baz (None, 'example.com', 'bar@baz')
example.com/bar/baz (None, 'example.com', 'bar/baz')
bär@exämple.com/bäz ('bär', 'exämple.com', 'bäz')
В сторону: если вы не знакомы с конструкцией (? :), это набор символов, который не добавляет группу к выводу.