Reverse Engineering is trying to re-create the source code from the compiled code. That is how a piece of s/w works given only d final system. Re-Engineering on d other hand is creating a new piece of s/w with similar functionality as an exisitng one. But you may be improving it the way it is built.
Reverse Engineering means we know the output and we start from the end point and generate the need base code/stuff. For example, when we are working on any software development, and we know how different entities would interact with each other, and what are all intermediate things involved, then we can generate the needed classes and other stuff. If you are aware of UML diagrams, then once we have a diagram in place, we can generate the classes and methods from this diagram. there are different tools available to achieve this. This is called reverse engineering. we are starting from the output state and going back to input state.
Re-engineering is totally different from this. when we are implementing something that has already been implemented, and also with the same desired output. we call it re-engineering. It can have two aspects. one is re-inventing the wheel, while other one is to reimplement something with desired output but to achieve something extra in between that can help us to hook something. If we are reimplementing the concatenation logic of string, then we are re-inventing the wheel since it is already implemented in java APIs. If are reimplementing the concatenation logic in order to provide hook points in between so that we can leverage something extra, we call it true re-engineering.
Hope it helps u. :)