Having regex_matches exclude cases where both capturing groups match a 0-length string
I can get this by making the whole preface digit optional and ignoring the trailing pipe you put in the last group, I think you can remove the NULLs after by another process:
select array(
  select regexp_matches(
    '9a.-16.y -y. -7hello world',
    '(-\d+|\d+)?([a-zA-Z][a-zA-Z.]*)',
    'g'
));
                        array                        
-----------------------------------------------------
 {{9,a.},{NULL,y},{NULL,y.},{-7,hello},{NULL,world}}