Problem to apply replacement with regexp that include look ahead in Postgres
Look-ahead are zero width.  They don't match anything themselves.  So your replacement operations is just replacing the empty string with the empty string, under certain conditions.

Simply removing the look-ahead designation makes it give the answer you want for your one example:

select regexp_replace ('12s2-3 abc def', '^.*\d', '');