With other regular expression implementations (i.e. not Microsoft's), you can use what is called Negative Lookbehind to solve this using RE. But we can't do that here.
So, instead, you could use nested If() or IfElse() statements with IsEqual(), to first test the value of [genre] for Soul/R'n'B. But that is clumsy. So let's use the fact that IsEqual() returns a 0 or 1 value, and by tacking that in front of Genre, we can use the same RE with a minor adjustment:
if(Regex(isequal([genre], Soul//, 7)[genre], /#^0([^(/>]+)[(/>]#/), [R1], [genre])
Whenever your string doesn't match (i.e. you want to split the genre), this expressions places a 0 before the [genre] value that Regex() sees, and the RE matches and captures only the first portion of genre (and not the 0). Otherwise, a 1 is appended, and the RE won't match, so whole [genre] is output.
If you want to match more patterns to exclude, we can use Regex inside:
if(Regex(regex([genre], /#(?:Soul/R'n'B|Classical/Opera)#/)[genre], /#^0([^(/>]+)[(/>]#/, 0), [R1], [genre])
Your strings are separated by the alternation | symbol in the RE. Now you can add more exceptions easily.