Je veux trouver la position (ou l'index) de la dernière occurrence d'une certaine sous-chaîne dans la chaîne entrée donnée str
.
Par exemple, supposons que la chaîne entrée soit str = 'hello'
et que la sous-chaîne soit target = 'l'
, elle devrait alors générer 3.
Comment puis-je faire ceci?
Vous pouvez utiliser rfind()
ou rindex()
Liens Python2: 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 différence est que lorsque la sous-chaîne n'est pas trouvée, rfind()
renvoie -1
alors que rindex()
lève une exception ValueError
(lien Python2: ValueError
).
Si vous ne souhaitez pas vérifier le code retour rfind()
-1
, vous préférerez peut-être rindex()
qui fournira un message d'erreur compréhensible. Sinon, vous pouvez rechercher des minutes pour lesquelles la valeur inattendue -1
provient de votre code ...
>>> txt = '''first line
... second line
... third line'''
>>> txt.rfind('\n')
22
>>> txt.rindex('\n')
22
Utilisez la méthode str.rindex
.
>>> 'hello'.rindex('l')
3
>>> 'hello'.index('l')
2
Essaye ça:
s = 'hello plombier pantin'
print (s.find('p'))
6
print (s.index('p'))
6
print (s.rindex('p'))
15
print (s.rfind('p'))
La bibliothèque more_itertools
propose des outils permettant de rechercher des index de tous les caractères ou de toutes .
Étant donné
_import more_itertools as mit
s = "hello"
pred = lambda x: x == "l"
_
Code
Caractères
Maintenant, il y a l'outil rlocate
disponible:
_next(mit.rlocate(s, pred))
# 3
_
Un outil complémentaire est locate
:
_list(mit.locate(s, pred))[-1]
# 3
mit.last(mit.locate(s, pred))
# 3
_
sous-chaînes
Un paramètre _window_size
_ est également disponible pour localiser le premier élément de plusieurs éléments:
_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
_
Je n'essaye pas de ressusciter un message inactif, mais puisque cela n'a pas encore été publié ...
(Voici comment je l'ai fait avant de trouver cette question)
s = "hello"
target = "l"
last_pos = len(s) - 1 - s[::-1].index(target)
Explication: Lorsque vous recherchez la dernière occurrence, vous recherchez réellement la première occurrence de la chaîne inversée. Sachant cela, j'ai fait s[::-1]
(qui retourne une chaîne inversée), puis indexé le target
à partir de là. Ensuite, j’ai fait len(s) - 1 - the index found
parce que nous voulons l’index dans la chaîne non inversée (c’est-à-dire originale).
Attention, quand même! Si target
contient plus d'un caractère, vous ne le trouverez probablement pas dans la chaîne inversée. Pour résoudre ce problème, utilisez last_pos = len(s) - 1 - s[::-1].index(target[::-1])
, qui recherche une version inversée de target
.
Si vous ne voulez pas utiliser rfind alors cela fera l'affaire /
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