Enumerating the possibilities allowed by the grammar:
>>> seq[:] # [seq[0], seq[1], ..., seq[-1] ]
>>> seq[low:] # [seq[low], seq[low+1], ..., seq[-1] ]
>>> seq[:high] # [seq[0], seq[1], ..., seq[high-1]]
>>> seq[low:high] # [seq[low], seq[low+1], ..., seq[high-1]]
>>> seq[::stride] # [seq[0], seq[stride], ..., seq[-1] ]
>>> seq[low::stride] # [seq[low], seq[low+stride], ..., seq[-1] ]
>>> seq[:high:stride] # [seq[0], seq[stride], ..., seq[high-1]]
>>> seq[low:high:stride] # [seq[low], seq[low+stride], ..., seq[high-1]]
Of course, if (high-low)%stride != 0, then the end point will be a little lower than high-1.
If stride is negative, the ordering is changed a bit since we're counting down:
>>> seq[::stride] # [seq[-1], seq[stride], ..., seq[0] ]
>>> seq[high::stride] # [seq[high], seq[high+stride], ..., seq[0] ]
>>> seq[:low:stride] # [seq[-1], seq[stride-1], ..., seq[low+1]]
>>> seq[high:low:stride] # [seq[high], seq[high+stride], ..., seq[low+1]]
Extended slicing (with commas and ellipses) are mostly used only by special data structures (like Numpy); the basic sequences don't support them.
>>> class slicee:
... def __getitem__(self, item):
... return `item`
...
>>> slicee()[0, 1:2, ::5, ...]
'(0, slice(1, 2, None), slice(None, None, 5), Ellipsis)'