Спасибо за смешную проблему!
Нам нужно разбить его на части:
(a{s1 to end})|(b{s3 to end})
{s1 to end}:
{s1 to s1}*{s1 to end without coming back to s1}
{от s1 до s1}:
(a(ab)*b)|(ba)
{s1 до конца, не возвращаясь к s1}:
b|(aa(ba)*)
{s3 до конца}:
{s3 to s3}*{s3 to end without coming back to s3}
{от s3 до s3}:
(b(ba)*a)|(ab)
{s3 до конца, не возвращаясь к s3}:
a|(bb(ab)*)
Тогда мы можем собрать все это вместе:
(a{s1 to s1}*{s1 to end without coming back to s1})|(b{s3 to s3}*{s3 to end without coming back to s3})
что в итоге дает:
(a((a(ab)*b)|(ba))*(b|(aa(ba)*)))|(b((b(ba)*a)|(ab))*(a|(bb(ab)*)))
РЕДАКТИРОВАТЬ: исправлена ошибка, которая проскользнула в последнее выражение