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

348

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

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

Comment puis-je faire ceci?

Parth
la source

Réponses:

600

Utilisation .rfind():

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

Ne l'utilisez pas non plus strcomme nom de variable ou vous ombrerez le intégré str().

Rik Poggi
la source
7
+1 pour que le conseil ne soit pas utilisé strcomme nom de variable. Un autre nom de variable que les gens devraient éviter en python est abc; il y a un module appelé abcdans l'API native.
progyammer
80

Vous pouvez utiliser des liensrfind() ou Python2:rindex()
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 lorsque la sous-chaîne n'est pas trouvée, rfind()retourne -1alors que rindex()déclenche une exception ValueError(lien Python2:) ValueError.

Si vous ne voulez pas vérifier le rfind()code retour -1, vous préférerez peut-être rindex()que cela fournisse un message d'erreur compréhensible. Sinon, vous pouvez rechercher des minutes où la valeur inattendue -1provient 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
olibre
la source
Salut @JacobSchneider. J'ai ajouté un exemple selon votre commentaire. Je ne comprends pas votre problème. Veuillez fournir plus d'informations: Version Python, Contenu de votre chaîne ... Acclamations
olibre
39

Utilisez la str.rindexméthode.

>>> 'hello'.rindex('l')
3
>>> 'hello'.index('l')
2
rmmh
la source
5

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

La more_itertoolsbibliothèque propose des outils pour trouver des index de tous les caractères ou de toutes les sous-chaînes .

Donné

import more_itertools as mit


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

Code

Personnages

Maintenant, l' rlocateoutil est 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 window_sizeparamètre est également disponible pour localiser l'élément principal 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
pylang
la source
2

N'essayant pas de ressusciter un post inactif, mais comme cela n'a pas encore été posté ...

(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 vraiment la première occurrence dans la chaîne inversée. Sachant cela, je l'ai fait s[::-1](ce qui renvoie une chaîne inversée), puis j'ai indexé le à targetpartir de là. Ensuite, je l'ai fait len(s) - 1 - the index foundparce que nous voulons l'index dans la chaîne non inversée (c'est-à-dire d'origine).

Attention cependant! S'il targety a 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.

Adi219
la source
1
J'ai voté pour cette réponse parce que, bien que pas trop utile pour la question d'origine, elle était intéressante et pédagogique en général. Je pense qu'une grande partie de l'apprentissage de Python est comme ça.
Bill Evans à Mariposa le
@BillEvansatMariposa merci :)
Adi219
1

Si vous ne voulez pas utiliser rfind, 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
Salam
la source
0

vous pouvez utiliser la rindex()fonction pour obtenir la dernière occurrence d'un caractère dans la chaîne

s="hellloooloo"
b='l'
print(s.rindex(b))
praveen kumar
la source
0

Python String rindex (), méthode

Description La
méthode de chaîne Python rindex () renvoie le dernier index où se trouve la chaîne de sous-chaîne, ou déclenche une exception si aucun index de ce type n'existe, restreignant éventuellement la recherche à la chaîne [beg: end].

Syntaxe
Voici la syntaxe de la méthode rindex () -

str.rindex(str, beg=0 end=len(string))

Paramètres
str - Ceci spécifie la chaîne à rechercher.

beg - Ceci est l'index de départ, par défaut son 0

len - C'est la fin de l'index, par défaut c'est égal à la longueur de la chaîne.

Valeur de retour
Cette méthode retourne le dernier index s'il est trouvé, sinon déclenche une exception si str n'est pas trouvé.

Exemple
L'exemple suivant montre l'utilisation de la méthode rindex ().

Démo en direct

! / usr / bin / python

str1 = "this is string example....wow!!!";
str2 = "is";

print str1.rindex(str2)
print str1.index(str2)

Lorsque nous exécutons le programme ci-dessus, il produit le résultat suivant -

5
2

Ref: Méthode rindex () de chaîne Python - Tutorialspoint

Wise4Christ
la source