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 el método str.rindex
.
>>> ''hello''.rindex(''l'')
3
>>> ''hello''.index(''l'')
2