Sorry for the delay in responding. I was out working in the yard all day (and ate fresh 2 grapefruits and an orange - yum).
Here's the breakdown of the RE, highlighted in red:
Regex([Composition], /#(Hob|Op\.|op|BWV|D\.|KV|woo\.) ?([^)(" ]+)#/, -1)/ [R1] [R2]
The initial capture group:
(Hob|Op\.|op|BWV|D\.|KV|woo\.)
matches Hob or Op. or op or BWV or D. or KV or woo. and remembers it (because it is a capture). What was matched will be in MC's [R1] pseudo-field.
The next piece, the " ?", allows for an optional space to follow the text above (I've used quotes here so you can see/read the <space> followed by the question mark). The <space> is the character to match, and the ? makes it optional (i.e. 0 or 1 of them). It could have been written as \s? too. This allows the space that is in the middle of your "D. 810", or no space, as in "op32". (I don't have at hand all the variances that were present in your input, so just made up the op32 for an example.)
The next piece:
([^)(" ]+)
is another capture group, requiring a match on anything that is NOT any of the following characters enclosed in the [ ] character group:
) ( " <space>
and the + quantifier means match one or more of them. Again, the capture is remembered for later use, this time in MC's [R2].
I used the -1 Regex() mode because we don't want output from Regex() itself - rather, we want to perform the match, and we'll just use the captures stored in [R1] and [R2]. By not outputting immediately, you can use the [R#] values at your convenience, and in the order you want, later.
The trick when writing REs is to try to notice distinct patterns in the input, and then reducing these patterns into the simple RE constructs such that a match will occur. In your case, Composition was rather straightforward, as it was basically some word (Op, BMV, etc.) followed by some number or other (which was easier to describe by saying NOT certain characters).