Encuentra el índice de la última aparición de una subcadena en una cadena


347

Quiero encontrar la posición (o índice) de la última aparición de una determinada subcadena en una cadena de entrada dada str.

Por ejemplo, supongamos que la cadena de entrada es str = 'hello'y la subcadena es target = 'l', entonces debería generar 3.

¿Cómo puedo hacer esto?

Respuestas:


600

Uso .rfind():

>>> s = 'hello'
>>> s.rfind('l')
3

Tampoco lo use strcomo nombre de variable o va a sombrear el incorporado str().


77
+1 para que la sugerencia no se use strcomo nombre de variable. Otro nombre de variable que la gente debería evitar en python es abc; Hay un módulo llamado abcen la API nativa.
Progyammer

80

Puede usar rfind()o enlaces de Python2:rindex()
rfind() rindex()

>>> s = 'Hello StackOverflow Hi everybody'

>>> print( s.rfind('H') )
20

>>> print( s.rindex('H') )
20

>>> print( s.rfind('other') )
-1

>>> print( s.rindex('other') )
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: substring not found

La diferencia es cuando no se encuentra la subcadena, rfind()regresa -1mientras se rindex()genera una excepción ValueError(enlace Python2:) ValueError.

Si no desea verificar el rfind()código de retorno -1, puede preferir rindex()que le proporcione un mensaje de error comprensible. De lo contrario, puede buscar minutos de donde -1proviene el valor inesperado dentro de su código ...


Ejemplo: búsqueda del último carácter de nueva línea

>>> txt = '''first line
... second line
... third line'''

>>> txt.rfind('\n')
22

>>> txt.rindex('\n')
22

Hola @JacobSchneider. He agregado un ejemplo de acuerdo a tu comentario. No entiendo tu problema. Proporcione más información: versión de Python, contenido de su cadena ... Saludos
olibre

39

Usa el str.rindexmétodo.

>>> 'hello'.rindex('l')
3
>>> 'hello'.index('l')
2

5

Prueba esto:

s = 'hello plombier pantin'
print (s.find('p'))
6
print (s.index('p'))
6
print (s.rindex('p'))
15
print (s.rfind('p'))

3

La more_itertoolsbiblioteca ofrece herramientas para encontrar índices de todos los caracteres o todas las subcadenas .

Dado

import more_itertools as mit


s = "hello"
pred = lambda x: x == "l"

Código

Caracteres

Ahora hay una rlocateherramienta disponible:

next(mit.rlocate(s, pred))
# 3

Una herramienta complementaria es locate:

list(mit.locate(s, pred))[-1]
# 3

mit.last(mit.locate(s, pred))
# 3

Subcadenas

También hay un window_sizeparámetro disponible para localizar el elemento principal de varios elementos:

s = "How much wood would a woodchuck chuck if a woodchuck could chuck wood?"
substring = "chuck"
pred = lambda *args: args == tuple(substring)

next(mit.rlocate(s, pred=pred, window_size=len(substring)))
# 59

2

No intento resucitar una publicación inactiva, pero como aún no se ha publicado ...

(Así es como lo hice antes de encontrar esta pregunta)

s = "hello"
target = "l"
last_pos = len(s) - 1 - s[::-1].index(target)

Explicación: cuando busca la última aparición, realmente busca la primera aparición en la cadena invertida. Sabiendo esto, lo hice s[::-1](que devuelve una cadena invertida), y luego indicé targetdesde allí. Luego lo hice len(s) - 1 - the index foundporque queremos el índice en la cadena no invertida (es decir, original).

¡Pero cuidado! Si targethay más de un carácter, probablemente no lo encontrará en la cadena invertida. Para solucionar esto, use last_pos = len(s) - 1 - s[::-1].index(target[::-1]), que busca una versión inversa de target.


1
Voté esta respuesta porque, aunque no era demasiado útil para la pregunta original, era interesante y educativa en general. Creo que gran parte del aprendizaje de Python es así.
Bill Evans en Mariposa

@BillEvansatMariposa gracias :)
Adi219

1

Si no quieres usar rfind, entonces este será el truco /

def find_last(s, t):
    last_pos = -1
    while True:
        pos = s.find(t, last_pos + 1)
        if pos == -1:
            return last_pos
        else:
            last_pos = pos

0

puede usar la rindex()función para obtener la última aparición de un carácter en cadena

s="hellloooloo"
b='l'
print(s.rindex(b))

0

Método de Pydex String rindex ()

Descripción
Método de cadena de Python rindex () devuelve el último índice donde se encuentra la cadena de subcadena, o genera una excepción si no existe dicho índice, opcionalmente restringiendo la búsqueda a la cadena [beg: end].

Sintaxis
Siguiente es la sintaxis para el método rindex () -

str.rindex(str, beg=0 end=len(string))

Parámetros
str: especifica la cadena a buscar.

beg - Este es el índice inicial, por defecto es 0

len - Este es el índice final, por defecto es igual a la longitud de la cadena.

Valor de retorno
Este método devuelve el último índice si se encuentra, de lo contrario genera una excepción si no se encuentra str.

Ejemplo
El siguiente ejemplo muestra el uso del método rindex ().

Demo en vivo

! / usr / bin / python

str1 = "this is string example....wow!!!";
str2 = "is";

print str1.rindex(str2)
print str1.index(str2)

Cuando ejecutamos el programa anterior, produce el siguiente resultado:

5
2

Ref: Método de Python String rindex () - Tutorialspoint

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.