einfaches find rekursiv verwenden

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
PyPengu
User
Beiträge: 1
Registriert: Samstag 7. August 2021, 07:16

Hallo Leute,

heute wollte ich ohne Anleitung einfach mal mit der 'find'-Methode drauf los probieren. Ich möchte alle Positionen an denen der Sub-String gefunden wird ausgeben. Aber ich stecke seit 1-2 Stunden fest. Den Plan was ich alles schon versucht habe, den habe ich auch nicht mehr.

Mein Code-Schnipsel wäre hier.

Vielen Dank!
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn man nicht weiter kommt, hilft es, Schritt für Schritt auszugeben, welche Werte die einzelnen Variablen haben. Dann merkst Du, dass Du mit `text = text[resultat:]` immer dafür sorgst, dass der Suchtext ganz am Anfang von text steht.
Dann gibt es ganz am Ende noch das Problem, dass find zwar -1 zurückliefert, Du aber trotzdem nochmal positionen erweiterst.
Wenn man einer Variable einen Dummywert geben muß, damit eine while-Schleife startet, hat man eigentlich eine while-True-Schleife, die an der passenden Stelle per break beendet wird.

Code: Alles auswählen

positionen = []
altes_resultat = 0
while True:
    resultat = text.find(suche)
    if resultat < 0:
        break
    altes_resultat += resultat
    positionen.append(altes_resultat)
    altes_resultat += 1
    text = text[resultat+1:]
Jetzt kennt aber `find` ein zweites Argument, was die Sache viel einfacher macht:

Code: Alles auswählen

positionen = []
aktuelle_position = -1
while True:
    aktuelle_position = text.find(suche, aktuelle_position + 1)
    if aktuelle_position < 0:
        break
    positionen.append(aktuelle_position)
Da aber `find` einen problematischen Rückgabewert hat, wenn der Text nicht gefunden wurde, sollte man besser `index` benutzen:

Code: Alles auswählen

positionen = []
aktuelle_position = -1
try:
    while True:
        aktuelle_position = text.index(suche, aktuelle_position + 1)
        positionen.append(aktuelle_position)
except ValueError:
    pass
Antworten