web-dev-qa-db-fra.com

Python Recherche inversée dans la chaîne

J'ai une chaîne et un index arbitraire dans la chaîne. Je veux trouver la première occurrence d'une sous-chaîne avant l'index.

Un exemple: je veux trouver l'index du 2ème I en utilisant l'index et str.rfind()

s = "Hello, I am 12! I like plankton but I don't like Baseball."
index = 34 #points to the 't' in 'but'
index_of_2nd_I = s.rfind('I', index)
#returns = 36 and not 16 

Maintenant, je m'attendrais à ce que rfind () retourne l'index du 2e I (16) mais il retourne 36. après l'avoir recherché dans la documentation, j'ai découvert que rfind ne signifie pas la recherche inversée.

Je suis totalement nouveau à Python donc y a-t-il une solution intégrée pour inverser la recherche? Comme inverser la chaîne avec de la magie python [:: - 1] et en utilisant find, etc? Ou devrai-je inverser itérer caractère par caractère à travers la chaîne?

30
user156027

Votre appel indique à rfind de commencer à chercher l'index 34. Vous voulez utiliser le surcharge de rfind qui prend une chaîne, un début et une fin. Dites-lui de commencer au début de la chaîne (0) et arrêtez de regarder index:

>>> s = "Hello, I am 12! I like plankton but I don't like Baseball."
>>> index = 34 #points to the 't' in 'but'
>>> index_of_2nd_I = s.rfind('I', 0, index)
>>>
>>> index_of_2nd_I
16
42
Blair Conrad

Je suis devenu curieux de savoir comment implémenter la recherche n fois pour la chaîne de fin par partition et j'ai fait cette nième boucle de partition:

orig = s = "Hello, I am 12! I like plankton but I don't like Baseball."
found = tail = ''
nthlast = 2
lookfor = 'I'
for i in range(nthlast):
    tail = found+tail
    s,found,end = s.rpartition(lookfor)
    if not found:
        print "Only %i (less than %i) %r in \n%r" % (i, nthlast, lookfor, orig)
        break
    tail = end + tail
else:
    print(s,found,tail)
2
Tony Veijalainen