length python string

length - python string substring



Buscar índice de la última aparición de una subcadena en una cadena (7)

La biblioteca more_itertools 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 está disponible la herramienta de rlocate :

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 parámetro window_size 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

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

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

¿Cómo puedo hacer esto?


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

(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 está buscando la última aparición, realmente está buscando la primera aparición en la cadena invertida. Sabiendo esto, hice s[::-1] (que devuelve una cadena invertida), y luego indexé el target desde allí. Luego hice len(s) - 1 - the index found porque queremos el índice en la cadena sin reversión (es decir, original).

¡Cuidado, aunque! Si el target es 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 invertida de target .


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''))


Puedes usar rfind() o rindex()
Enlaces de Python2: rfind() rindex()

>>> s = ''Hello 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() devuelve -1 mientras que rindex() genera una excepción ValueError (enlace de ValueError : ValueError ).

Si no desea verificar el código de retorno rfind() -1 , puede preferir rindex() que proporcionará un mensaje de error comprensible. De lo contrario, puede buscar minutos donde el valor inesperado -1 proviene 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


Si no quieres usar .rfind() entonces esto hará 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


Utilice .rfind() :

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

Tampoco use str como nombre de variable o sombreará el str() incorporado.


Utilice el método str.rindex .

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