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

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
dieHenne
User
Beiträge: 5
Registriert: Montag 5. April 2004, 21:11

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
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
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
dieHenne
User
Beiträge: 5
Registriert: Montag 5. April 2004, 21:11

wo ist den nur mein kopf? :)
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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
Antworten