Tomado de
CÓMO de expresiones regulares
span () devuelve los índices inicial y final en una única tupla. Dado que el método de coincidencia solo comprueba si el RE coincide al comienzo de una cadena, start () siempre será cero. Sin embargo, el método de búsqueda de las instancias de RegexObject escanea la cadena, por lo que es posible que la coincidencia no comience en cero en ese caso.
>>> p = re.compile('[a-z]+')
>>> print p.match('::: message')
None
>>> m = p.search('::: message') ; print m
<re.MatchObject instance at 80c9650>
>>> m.group()
'message'
>>> m.span()
(4, 11)
Combina eso con:
En Python 2.2, el método finditer () también está disponible y devuelve una secuencia de instancias de MatchObject como iterador.
>>> p = re.compile( ... )
>>> iterator = p.finditer('12 drummers drumming, 11 ... 10 ...')
>>> iterator
<callable-iterator object at 0x401833ac>
>>> for match in iterator:
... print match.span()
...
(0, 2)
(22, 24)
(29, 31)
deberías poder hacer algo del orden de
for match in re.finditer(r'[a-z]', 'a1b2c3d4'):
print match.span()