2010-08-21 9 views
21

Ich habe eine Zeichenfolge und einen beliebigen Index in die Zeichenfolge. Ich möchte das erste Vorkommen eines Teilstrings vor dem Index finden.Python Reverse Finden in String

Ein Beispiel: Ich möchte mit Hilfe des Index und 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 

Jetzt würde ich erwarten rfind() den Index des 2. ich finden den Index des zweiten I (16), aber es zurück zurück 36. Nachdem ich in den Dokumenten nachgeschlagen habe, habe ich herausgefunden, dass rfind nicht für einen umgekehrten Fund steht.

Ich bin völlig neu in Python, also gibt es eine eingebaute Lösung zum Reverse-Finden? Wie die Zeichenfolge mit etwas Python [:: - 1] Magie umzukehren und Fund usw. zu verwenden? Oder muss ich das Char-Zeichen um den String durch die Zeichenfolge iterieren?

+1

Wenn jsz wirklich 12 ist, dann ist er/sie ein helles Kind ;-) – sidewinderguy

+0

Ja, der Anfang der Reverse-Suche ist nicht der rechte Punkt. Ich finde (Wortspiel beabsichtigt) das "r" in "rfind" irreführend. Es ist weniger zweideutig, 's.rfind (s, start, end)' zu sehen, wenn das * letzte * Vorkommen in 's [start: end]' zurückgegeben wird. – YvesgereY

Antwort

27

Ihr Anruf sagen rfind zu fangen Sie an, auf Index 34 zu suchen. Sie möchten das rfind overload verwenden, das eine Zeichenkette, einen Anfang und ein Ende nimmt. Sagen Sie es am Anfang des Strings (0) und stoppen Blick auf index zu starten:

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

Ich wurde neugierig, wie zu implementieren suchen n-mal für Zeichenfolge Ende durch rpartition und tat dies n-ten rpartition Schleife:

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) 
+1

wow, das tut wirklich weh :( – unbeli

+0

Irgendetwas Spezifisches? Die Motivation ist, dass im Gegensatz zu den Funden die Partition nicht den Startindex hat, da es indexlos ist. –