Text herausfiltern

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
Crazed
User
Beiträge: 171
Registriert: Sonntag 18. Mai 2008, 11:44

Hallo, Ich habe mir eine kleine Funktion geschrieben um den Text zwischen 2 Strings herauszubekommen

Code: Alles auswählen

    def _cut(self, string, startstr, endstr):
        '''Returns the string between "startstr" and "endstr"'''
        if string.find(startstr) or string.find(endstr) == -1:
            return -1
        else:
            return string[string.find(startstr)+len(startstr):string.find(endstr)]
Das funktioniert auch z.b bei diesem String

>>> cut('python ist toll', 'python ', ' toll')
'ist'

Aber bei diesem String klappt es nicht mehr:

http://paste.pocoo.org/show/52993/

-1

Er gibt mir immer nichts oder -1 zurück wenn ich z.B das probiere:

Code: Alles auswählen

cut(test, 'Gold', 'stand')
Die Funktion müsste dann ja eigentlich 'be' zurückgeben und nicht -1.
Hat jemand eine Idee?
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Code: Alles auswählen

    def _cut(self, string, startstr, endstr):
        '''Returns the string between "startstr" and "endstr"'''
        if string.find(startstr) == -1 or string.find(endstr) == -1:
            return -1
        else:
            return string[string.find(startstr)+len(startstr):string.find(endstr)]
So würde ich das wohl machen:

Code: Alles auswählen

import string

def _cut(s, start, end):
        '''Returns the string between "startstr" and "endstr"'''
        begin, ending = string.find(s, start), string.find(s, end)
        if begin != -1 and  ending != -1:
            return string[begin + len(start): ending]
        else:
            raise ValueError("Token not found!")
Zuletzt geändert von audax am Freitag 23. Mai 2008, 08:08, insgesamt 1-mal geändert.
Crazed
User
Beiträge: 171
Registriert: Sonntag 18. Mai 2008, 11:44

Danke sehr! :)!
Crazed
User
Beiträge: 171
Registriert: Sonntag 18. Mai 2008, 11:44

Habs grade noch verbesser, er sucht jetzt nur noch nach dem endstr NACH der Position des startstr:

Code: Alles auswählen

    def _cut(self, string, startstr, endstr):
        '''Returns the string between "startstr" and "endstr"'''
        #Checks if both of the string parts exist in the in "string"
        if string.find(startstr) == -1 or string.find(endstr) == -1:
            return -1
        else:
            #Return the text between "startstr" and "endstr"
            return string[string.find(startstr)+len(startstr):string.find(endstr, string.find(startstr)+len(startstr))]
BlackJack

Alle Lösungen bisher haben aber Probleme wenn die Endzeichenkette auch schon mal *vor* der Startzeichenkette vor kommt, das gilt auch noch für die letzte Lösung von Crazed.

Lösungsvorschlag:

Code: Alles auswählen

def cut(string, start, end):
    start_index = string.index(start) + len(start)
    end_index = string.index(end, start_index)
    return string[start_index:end_index]
Wenn `start` oder `end` nicht gefunden werden, dann löst das jeweilige `index()` einen `ValueError` aus.

@Crazed: Wenn `self` in einer Methode nicht verwendet wird, ist das oft ein Zeichen, dass es sich eigentlich um eine Funktion handelt und nicht in eine Klasse gehört.

"Spezielle" Rückgabewerte, die einen Fehler signalisieren sind sehr unschön, statt der -1 solltest Du besser mit Ausnahmen arbeiten.

@audax: Das `string`-Modul sollte man nicht für Funktionen benutzen, die es auch als Methoden auf Zeichenketten gibt.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

BlackJack hat geschrieben: @audax: Das `string`-Modul sollte man nicht für Funktionen benutzen, die es auch als Methoden auf Zeichenketten gibt.
Ich wollt mir nur das explizite umwandeln zum string sparen...aber hast ja recht.
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

@audax: In Zeile 8 wirfst du `s` und `string` durcheinander.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Trundle hat geschrieben:@audax: In Zeile 8 wirfst du `s` und `string` durcheinander.
gnah....man sollte Code vorher testen :D
Antworten