If the layer with the Y keyframes is named control and you did not separate dimensions (not often a good idea because the bezier handles go away and it's difficult to accurately define a curved path). this expression will give you a .2 second expand and .1 second contract on the Y scale value of another layer.
c = thisComp.layer("Control");
p = c.position;
kt = p.nearestKey(time).time;
if (time - kt > 0)
t = time - kt;
else
t = 0;
y = ease(t, 0, .2, 0, 50);
y2 = ease(t, .2, .3, 0, -50);
[value[0], value[1] + y + y2]
The expression looks for the time of the next keyframe and then eases (you could use linear) between zero and a 50% change in scale and adds that to the current scale value of the layer with the expression.
If you want the expansion to be 10% change the 50 and the -50 to 10 and -10.
If you want the timing to be faster, change the .2 to .15 in the first ease expression and .15 and .2 in the second.
The basic interpolation function is ease(t, tMin, tMax, value1, value2). The st of the expression is just simple math. If you want to keep separated dimensions, change the c = to c.transform.yPosition.

(note: the low frame rate of the animated gif is not showing all of the movement. It is all equal)
Here's the expression with a slight recoil using 3 y values and separated dimensions.
c = thisComp.layer("Control");
p = c.transform.yPosition;
kt = p.nearestKey(time).time;
if (time - kt > 0)
t = time - kt;
else
t = 0;
y = ease(t, 0, .09, 0, 20);
y2 = ease(t, .09, .25, 0, -30);
y3 = ease(t, .25, .28, 0, 10);
[value[0], value[1] + y + y2 + y3]
It's been kind of fun to play with this.