Zeros can be removed from the original list, provided that we keep track of the positions of the remaining numbers. Then we only need to detect when the sign changes from one remaining number to the next.
zeroCrossings[l_] := (c=Complement[Range[Length[l]], Flatten@Position[l, 0]])[[{#, #+ 1}]] & /@ Complement[Range[Length[d = Differences[Sign@l[[c]]]]], Flatten@Position[d, 0]] Example
Using whuber's list:
zeroCrossings[{0, -1, 1, -2, 0, 0, -1, 0, 0, 0, 1, 0, 1, 0, 2, -1, -3, 0, 0}] {{2, 3}, {3, 4}, {7, 11}, {15, 16}}
Analysis
The list:
l = {0, -1, 1, -2, 0, 0, -1, 0, 0, 0, 1, 0, 1, 0, 2, -1, -3, 0, 0} Positions of the non-zero values in the list:
Complement[Range[Length[l]], Flatten@Position[l, 0]] {2, 3, 4, 7, 11, 13, 15, 16, 17}
The Non-zero numbers themselves:
l[[%]] {-1, 1, -2, -1, 1, 1, 2, -1, -3}
Signs of the non-zero numbers:
Sign[%] {-1, 1, -1, -1, 1, 1, 1, -1, -1}
Differences between the signs of the non-zero numbers:
Differences[%] {2, -2, 0, 2, 0, 0, -2, 0}
Starting positions for the zero-crossings :
Complement[Range[Length[%]], Flatten@Position[%, 0]] {1, 2, 4, 7}