web-dev-qa-db-fra.com

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 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?

268
Parth

Utilisez .rfind() :

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

De même, n'utilisez pas str comme nom de variable, sinon vous masquerez la fonction intégrée str() .

488
Rik Poggi

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 ...


Exemple: Recherche du dernier caractère de nouvelle ligne

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

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

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

Utilisez la méthode str.rindex.

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

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

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
_
3
pylang

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.

1
Adi219

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
1
Salam