2010-08-21 16 views
21

Tengo una cadena y un índice arbitrario en la cadena. Quiero encontrar la primera aparición de una subcadena antes del índice.Python Reverse Find en la cadena

Un ejemplo: Quiero encontrar el índice de la segunda I utilizando el índice y str.rfind()

s = "Hello, I am 12! I like plankton but I don't like Baseball." 
index = 34 #points to the 't' in 'but' 
index_of_2nd_I = s.rfind('I', index) 
#returns = 36 and not 16 

Ahora yo esperaría rfind() para devolver el índice de la segunda I (16) pero devuelve 36. después de buscarlo en los documentos descubrí que rfind no representa el hallazgo inverso.

Soy totalmente nuevo en Python, así que ¿hay una solución integrada para realizar búsquedas inversas? Como invertir la cadena con magia python [:: - 1] y usar find, etc. ¿O tendré que invertir la iteración de char por char a través de la cadena?

+1

Si jsz realmente es 12 entonces él/ella es un niño brillante ;-) – sidewinderguy

+0

Sí, el inicio de la búsqueda inversa no es el elemento más a la derecha. Encuentro (en el juego de palabras intencionado) que '' r' 'en' 'rfind'' es engañoso. Es menos ambiguo ver 's.rfind (s, start, end)' como devolver la * última * ocurrencia en 's [start: end]'. – YvesgereY

Respuesta

27

Su llamada Tell rfind a empezar a buscar en el índice 34. Usted desea utilizar el rfind overload que toma una cadena, un comienzo y un final. Dilo a empezar por el principio de la cadena (0) y dejar de mirar a index:

>>> s = "Hello, I am 12! I like plankton but I don't like Baseball." 
>>> index = 34 #points to the 't' in 'but' 
>>> index_of_2nd_I = s.rfind('I', 0, index) 
>>> 
>>> index_of_2nd_I 
16 
0

sentí curiosidad cómo implementar mirando n veces de cadena a partir de finales de rpartition e hicieron este bucle rpartition enésimo:

orig = s = "Hello, I am 12! I like plankton but I don't like Baseball." 
found = tail = '' 
nthlast = 2 
lookfor = 'I' 
for i in range(nthlast): 
    tail = found+tail 
    s,found,end = s.rpartition(lookfor) 
    if not found: 
     print "Only %i (less than %i) %r in \n%r" % (i, nthlast, lookfor, orig) 
     break 
    tail = end + tail 
else: 
    print(s,found,tail) 
+1

guau, eso duele realmente :( – unbeli

+0

¿Algo específico? La motivación es que a diferencia de los hallazgos, la partición no tiene el índice de inicio, ya que no tiene índice. –