Seite 1 von 1

seltsames verhalten von string.lstrip( chars ) ! bug?

Verfasst: Montag 5. April 2004, 21:39
von dieHenne
servus alle zusammen!

wollte heute mal wieder ein kleiner python skript schreiben
und bin dabei auf ein seltsames verhalten von string.lstrip() gestossen:

im interpreter:

>>>s = 'ugaaga'

>>>s.lstrip('ug')
'aaga' # also das seh ich ein

aber:

>>>s.lstrip('ugaa')
'' # also das is seltsam oder ??

wenn man da noch ein bisschen rumspielt wirds noch schlimmer :

>>> s='hallo ich bins'
>>> s.lstrip('hal')
'o ich bins' # wo ist das l ????

ich benutze python 2.3 und das problem besteht auf einem rechner mit gentoo-linux
und auf einem mit mandrake 9.2

also vielleicht steh ich auch auf dem schlauch aber ich halte das echt für einen bug :x.
allerdings wurde noch keiner gepostet denke ich.
bevor ich jetzt aber n report aufmachen wollte wollt ich mal fragen ob unter
anderen versionen oder plattformen dieser bug auch besteht.

wäre toll wenn das mal noch ein paar leute testen.

der parameter chars von lstrip() wurde meines wissens erst mit python 2.2
eingeführt auf früheren versionen des interpreters wird obiger code daher nicht
funktionieren.

merci

bis denne
henne

Verfasst: Montag 5. April 2004, 22:40
von Dookie
Hi dieHenne,

"it's not a bug, its a feature" ;)
nö im ernst, in der Dokumentation zu strings pydoc str steht:

Code: Alles auswählen

 |  lstrip(...)
 |      S.lstrip([chars]) -> string or unicode
 |
 |      Return a copy of the string S with leading whitespace removed.
 |      If chars is given and not None, remove characters in chars instead.
 |      If chars is unicode, S will be converted to unicode before stripping
etwas frei übersetzt:
"Gibt eine Kopie vom string S aus dem vorangestellte "nichtdruckbare Zeichen" entfernt wurden. Wenn chars ist angegeben und nicht None, werden die Zeichen in chars stattdessen entfernt. ...

Also jedes Zeichen das in chars enthalten ist und am Anfang von S steht wird entfernt, egal an welcher stelle es steht, bis ein Zeichen in S gefunden wird, das nicht in chars enthalten ist.

Code: Alles auswählen

>>> S = "Hallo Welt"
>>> print S.lstrip("aloH ")
 Welt
Gruss

Dookie

Verfasst: Dienstag 6. April 2004, 12:44
von Gast
danke dookie,

ja ja die Henne.
erst ganz laut bug schreien und dann hat er nur die doku zu schnell gelesen :oops:

danke trotzdem für die schnelle und nette antwort.

tja jetzt such ich allerdings immernoch nach einer geeigneten methode um den anfang eines
strings wegzulassen wenn er gleich einem anderen string ist.

Code: Alles auswählen

if  ( zeichenkette.startswith(suchstring) ):
		zeichenkette = zeichenkette[len(suchstring):]
müsste zwar klappen, aber besonders elegant sieht das ja nicht aus.
ein einzeiler wäre schöner.
und mit regexps zu arbeiten ist ja nicht gerade der python-way oder?

also normalerweise würde ich da echt nicht so nen aufstand machen,
aber ich portiere gerade eins meiner perl-skripte nach python
und in perl is das eine zeile *g*

äusserst uncool das jetzt auf zwei zeilen auszudehnen.

irgendwelche ideen ?

bis denne

henne

mann und einloggen hab ich auch vergessen

Verfasst: Dienstag 6. April 2004, 12:47
von dieHenne
wo ist den nur mein kopf? :)

Verfasst: Dienstag 6. April 2004, 16:37
von Milan
Anonymous hat geschrieben:äusserst uncool das jetzt auf zwei zeilen auszudehnen.
Hi. Wieso denn? Bei solchen kleine Sachen ärgert mich das vielleicht auch, weil man denkt das muss doch noch besser gehen, aber bei größeren Sachen find ich es krank, wenn ich mir dann Perl-Code dazu anschaue, was da veranstaltet wird *schauder*...

Aber hier dein Einzeiler:

Code: Alles auswählen

text=(text.startswith(weg) and [text[len(weg):]] or [text])[0]
#oder aber das:
text=[i.split(weg,1)[1] for i in (text,) if i.startswith(weg)][0] or [text][0]
Konsequenter wäre es aber nun mal in zwei Zeilen, wenn eine ganze Wortgruppe mehrmals weg soll:

Code: Alles auswählen

while text.startswith(weg):
    text=text[len(weg):]

Fazit: es sieht allerdings immer dumm aus und ob es effizienter ist weiß ich nicht... Also warum nicht mal trotzdem zwei Zeilen schreiben? Ein einzelnes if geht auch in eine Zeile:

Code: Alles auswählen

if text.startswith(weg): text=text[len(weg):]
Milan