Solve an equation with (almost) any numbers you like
Retina, 58 bytes

[-+]
$&amp;1
\B((\+1)|(-1))*
$._$*1$#3$*1$#2$*_$&amp;
+`1_

1+
$.&amp;


Try it online!

Alternative solution at the same byte count:

((\+)|(-))*
$._$*1$#3$*1$#2$*_$&amp;
+`1_

([+-])1*
$+1
1+
$.&amp;


Try it online!

Explanation

The basic idea is to turn all the +s and -s into simple +1 and -1 operations and then to prepend a sufficiently large number that makes all the equations work. To make the equations match, we can simply prepend the same number to each of them, and then reduce it by one for each +1 and increase it by one for each -1 after it. Since we'll be working with unary numbers, the only catch is that the first number needs to be large enough that we can reduce it by 1 enough times.

[-+]
$&amp;1


We start by inserting a 1 after each - or +.

\B((\+1)|(-1))*
$._$*1$#3$*1$#2$*_$&amp;


The \B ensures that these matches are either at the beginning of the input, or between a = and a + or -, i.e. all the positions where we want to insert the leading number of an expression. The  ((\+1)|(-1))* part then simply counts the number of +1s and -1s in groups 2 and 3 respectively. Now let's break down the substitution string:

$._$*1   # For each character in the current string, insert a 1. This is
         # an offset which is the same for each expression and is guaranteed
         # to be large enough that all subsequent +1s can be cancelled.
$#3$*1   # For each -1, insert a 1.
$#2$*_   # For each +1, insert a _.
$&amp;       # Re-insert the string of +1s and -1s.


+`1_



Repeatedly drop 1_ from the string, applying the required cancellation from the +1s.

1+
$.&amp;


Finally, replace all the strings of 1s with their lengths to convert from unary to decimal.