I’d split it up into separate patterns if possible. It’s much easier to set a pattern for each rule than to try to define the whole thing in one pattern.
Assuming you’re using this for model rules, you could use something like the following:
array('password', 'length', 'min'=>10),
array('password', 'match', 'pattern'=>'/\d/', 'message'=>'Password must contain at least one numeric digit.'),
array('password', 'match', 'pattern'=>'/\W/', 'message'=>'Password must contain at least one special character.'),