How to remove specials characters, but replace spaces?
Do the space-to-underscore replace() first, and your existing expression will do the rest.
testdb=# select regexp_replace(replace('ABC%$! DEF*&amp; GHI', ' ', '_'), '[^\w]+','','g');
 regexp_replace 
----------------
 ABC_DEF_GHI
(1 row)