stringr's just for syntactic convenience.
And also, I forgot R can handle nested capture groups, so you can actually replace the regex from my solution with the much shorter sub("(.*([A-Z]+[a-z]+) ([a-z]+))", "\\2_\\3_\\1", string). Note I've also fixed the regex to account for the fact that OP wants an underscore within the species name.
There's probably an even more concise solution with a single capture group, but I can't really think of it now. (Not that this matters for the OP probably.)
if sequences are in single line and headers are in exactly in same format:
with sed: