Trouver l'index de la dernière occurrence d'une sous-chaîne dans une chaîne

Je veux trouver la position (ou l'index) de la dernière occurrence d'une certaine sous-chaîne dans une chaîne entrée donnée str.

Par exemple, supposons que la chaîne entrée est str = 'hello' et la sous-chaîne est target = 'l', alors elle devrait sortir 3.

Comment puis-je faire cela?

208
demandé sur nbro 2012-03-05 23:13:32

7 réponses

Utiliser .rfind():

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

N'utilisez pas non plus str comme nom de variablestr().

370
répondu Rik Poggi 2012-03-05 19:15:12

Vous pouvez utiliser rfind() ou rindex()
Python2 liens: 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, c'est quand la sous-chaîne n'est pas trouvée, rfind() retourne -1 tout rindex() soulève une exception ValueError (Python2 lien: ValueError).

Si vous ne voulez pas vérifier le code de retour rfind() -1, vous pouvez préférer {[3] } qui fournira un message d'erreur compréhensible. Sinon, vous pouvez rechercher des minutes où le la valeur inattendue -1 provient de votre code...


Exemple: Recherche du dernier caractère de retour à la ligne

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

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

>>> txt.rindex('\n')
22
55
répondu olibre 2018-04-23 09:43:53

Utilisez la méthode str.rindex.

>>> 'hello'.rindex('l')
3
>>> 'hello'.index('l')
2
34
répondu rmmh 2012-03-05 19:15:18

Essayez ceci:

s = 'hello plombier pantin'
print (s.find('p'))
6
print (s.index('p'))
6
print (s.rindex('p'))
15
print (s.rfind('p'))
3
répondu Gad 2014-10-21 13:36:55

Le more_itertools la bibliothèque propose des outils pour trouver des indices de l'ensemble caractères, ou tous les sous-chaînes.

Compte tenu de

import more_itertools as mit


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

Code

les Caractères

Maintenant, il est le rlocate outil 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

les sous-Chaînes

Il y a aussi un paramètre window_size disponible pour localiser l'élément principal de plusieurs articles:

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
répondu pylang 2018-08-01 03:14:17

Si vous ne voulez pas utiliser rfind, puis 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
1
répondu Salam 2018-02-23 17:15:54

Ne pas essayer de ressusciter un post inactif, mais puisque cela n'a pas encore été posté...

(C'est comme ça que 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 vraiment la première occurrence dans la chaîne inversée. Sachant cela, j'ai fait s[::-1] (qui renvoie 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 le unreversed (c'est-à-dire original) chaîne.

Attention, cependant! Si target est 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.

1
répondu Adi219 2018-04-07 14:17:59