Seite 1 von 1

Text herausfiltern

Verfasst: Freitag 23. Mai 2008, 07:54
von Crazed
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?

Re: Text herausfiltern

Verfasst: Freitag 23. Mai 2008, 08:02
von audax

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!")

Verfasst: Freitag 23. Mai 2008, 08:05
von Crazed
Danke sehr! :)!

Verfasst: Freitag 23. Mai 2008, 08:23
von Crazed
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))]

Verfasst: Freitag 23. Mai 2008, 08:37
von 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.

Verfasst: Freitag 23. Mai 2008, 08:39
von audax
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.

Verfasst: Freitag 23. Mai 2008, 08:45
von Trundle
@audax: In Zeile 8 wirfst du `s` und `string` durcheinander.

Verfasst: Freitag 23. Mai 2008, 17:03
von audax
Trundle hat geschrieben:@audax: In Zeile 8 wirfst du `s` und `string` durcheinander.
gnah....man sollte Code vorher testen :D