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 .
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
seltsames verhalten von string.lstrip( chars ) ! bug?
-
- 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:
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.
Gruss
Dookie
"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
"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
Dookie
danke dookie,
ja ja die Henne.
erst ganz laut bug schreien und dann hat er nur die doku zu schnell gelesen
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.
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
ja ja die Henne.
erst ganz laut bug schreien und dann hat er nur die doku zu schnell gelesen
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):]
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
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*...Anonymous hat geschrieben:äusserst uncool das jetzt auf zwei zeilen auszudehnen.
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]
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):]