Driving a 7 Segment Display with a register vs wire
As transistor mentions in his answer, the logic represented by the two pieces of code you posted are not the same; it has differences in the bit ordering and the latter sample will display hex characters A-F.

But, you are asking about the difference between using a wire variable and an assign statement vs. a reg variable and an always @* construct.

One confusing thing about verilog is that using a reg data type in your code does not always imply that a register will be implemented in the synthesized logic.

In the cases you posted, both solutions would be implemented using combinatorial logic with no physical registers.  It is very common to use the always @* construct to model combinatorial logic.  

Sequential circuits, which will include physical registers (flip-flops), are also modeled using the always construct, but these circuits will have a posedge and/or negedge signal specified in the sensitivity list.

Of the cases you posted, I would personally prefer to use the always @* version of the code as I think that it more clearly shows the intent of the code; it is easy to see that it represents a decoding table.