Matt, Here is a variation on your solution using RegularExpression:
Define a test function:
TestQ := StringMatchQ[ToString[#], RegularExpression["[xyz]\\d"]] &
Cases[expr, Times[p_?TestQ, _]]
{x^2*x0, y^2*y0, z^2*z0}
It a simple matter to extend the pattern in the test function to handle
longer identifiers using the power of regex.
Cheers,
Brian