ECMAScript 6, 125127 bytes
Here is my regex attempt (using a single regex and some logic in the replacement callback):
i.replace(/(^|[*+-])(\d+|(?:([\d.]+)\^)?(x)(?:\^(-?[\d.]+))?)(?![.*^])/g,(m,s,a,b,x,e)=>s+(b?'ln'+b+'*'+a:e?e--+'*x^'+e:x?1:0))
This expects the input string to be stored in i
and simply returns the result. Try it out in an ECMAScript 6 compliant console (like Firefox's).