Seite 1 von 2
Warum gibt es kein "".replace dass...
Verfasst: Dienstag 2. Januar 2007, 14:08
von sape
[OffTopic]
...von hinten anfängt Zeichen zu ersetzen?
Code: Alles auswählen
"foobar('\\') \\".rreplace('\\', ' ', 1) -> "foobar('\\') "
Finde ich schade, weil es sonst für jede wichtige string Funktion eine l und r variante gibt :/ So, muss man sich nun dafür eine eigene Funktion schreiben.
[/OffTopic]
Verfasst: Dienstag 2. Januar 2007, 15:46
von Costi
du kannst zb die einzelnen zeichen in einer liste packen, .reversen wieder in einen string umwandeln, .replacen, und dam wieder in einer liste, .reversen und zu guter letzt zum zwiten mal "".joinen.
ok, ne ich glaub das musste doch irgendwie einfacher gehen...
Verfasst: Dienstag 2. Januar 2007, 15:52
von mawe
So:
Code: Alles auswählen
In [6]: "foobar(x) x"[::-1].replace("x", "", 1)[::-1]
Out[6]: 'foobar(x) '

Is natürlich Blödsinn, weils nur mit symmetrischen Ersetzungsteilstringsodersonstigendings geht.
Verfasst: Dienstag 2. Januar 2007, 17:38
von EyDu
mawe hat geschrieben:Is natürlich Blödsinn, weils nur mit symmetrischen Ersetzungsteilstringsodersonstigendings geht.
Naja, aber so schwer ist der naechste Schritt dann auch nicht mehr
Code: Alles auswählen
"foobar(abc) abc"[::-1].replace("abc"[::-1], "xyz"[::-1], 1)[::-1]
Verfasst: Dienstag 2. Januar 2007, 17:43
von BlackJack
Von dem ganzen Zeichenketten-Umdrehen wird einem ja ganz schwindelig.

Verfasst: Mittwoch 3. Januar 2007, 07:26
von sape
Ehm *hust* Leute ^^ Ja hab dafür eine Short-Funktion geschrieben die auch mit reverses arbeitet

Wollte den Thread nur mal öffnen weil ich das mal los werden wollte

Vielleicht hat ja jemand nen guten draht zu Guido und sagt ihn mal das wir all eine r variante haben wollen
lg
P.S.: Sorry merke gerade das ich das im flasche SubForum gepostet habe. Wollte das eigentlich ins OffTopic posten.
Verfasst: Mittwoch 3. Januar 2007, 08:20
von mawe
sape hat geschrieben:Vielleicht hat ja jemand nen guten draht zu Guido und sagt ihn mal das wir all eine r variante haben wollen
Alle?

Ich will überhaupt was anderes:
Code: Alles auswählen
>>> "x a x b x".replace("x", "", 1)
a x b x
>>> "x a x b x".replace("x", "", 2)
x a b x
>>> "x a x b x".replace("x", "", -1)
x a x b
Hat vielleicht jemand nen guten Draht zu Guido ...

Verfasst: Mittwoch 3. Januar 2007, 08:29
von sape
Ne dann lieber so:
Code: Alles auswählen
>>> "a|b|c|d".replace('|', '_', 1)
a_b|c|d
>>> "a|b|c|d".replace('|', '_', 1, reverse=False)
a_b|c|d
>>>"a|b|c|d".replace('|', '_', 1, reverse=True)
a|b|c_d
>>>"a|b|c|d".replace('|', '_')
a_b_c_d
Verfasst: Mittwoch 3. Januar 2007, 12:50
von Leonidas
Ich denke mit negativen Zahlen wäre das konsistenter. Schließlich funktionieren Slices genau so.
Verfasst: Mittwoch 3. Januar 2007, 13:09
von sape
Leonidas hat geschrieben:Ich denke mit negativen Zahlen wäre das konsistenter. Schließlich funktionieren Slices genau so.
Nein. Das wäre inkonsistent.
1. Der zweite Parameter gibt an wie viele der gefundenen ersetzt werden sollen. Wenn -1 übergeben wird, werden alle gefundenen ersetzt -> Das ist die bisherige Implementierung!
Code: Alles auswählen
>>> "a|b|c|d".replace('|', '_', 1)
a_b|c|d
>>>"a|b|c|d".replace('|', '_', 2)
a_b_c|d
>>>"a|b|c|d".replace('|', '_', 1)
a_b|c|d
>>>"a|b|c|d".replace('|', '_', -1) # So, -1 ist der Defaultwert ;)
a_b_c_d
>>>"a|b|c|d".replace('|', '_') # = replace('|', '_', -1)
a_b_c_d
Das jetzt als slice zu definieren würde das ganze nicht nur Inkonsistent machen sondern auch Inkompatibel zu allen Scripten vor Python X!

Davon abgesehen wäre die Funktion replace überflüssig wen der zweite Parameter ein Slice zu griff wäre weil man dann einfach gleich folgendes schreiben könnte:
Daher bin ich für einen dritten Parameter der angibt ob vorwärts angefangen wird zu replacen oder rückwärts (Das wäre auch zu allen anderen Python Versionen Kompatibel.
Code: Alles auswählen
>>>"a|b|c|d".replace('|', '_', 1, reverse=False)
a_b|c|d
>>>"a|b|c|d".replace('|', '_', 1) # Default ist reverse=False wegen Kompatibilität ;)
a_b|c|d
>>>"a|b|c|d".replace('|', '_', 1, reverse=True)
a|b|c_d
Und wo wir gerad bei Konsistenz sind. Das Konsistenteste wäre eine r _und_ l variante einzuführen, da alle wichtigen string Methoden eine l und r variante definieren.
EDIT: Fehler beseitigt.
Verfasst: Mittwoch 3. Januar 2007, 13:21
von Leonidas
sape hat geschrieben:Davon abgesehen wäre die Funktion replace überflüssig wen der zweite Parameter ein Slice zu griff wäre weil man dann einfach gleich folgendes schreiben könnte:
Wer hat denn davon gesprochen Strings mutabel zu machen?
Verfasst: Mittwoch 3. Januar 2007, 13:26
von sape
Leonidas hat geschrieben:sape hat geschrieben:Davon abgesehen wäre die Funktion replace überflüssig wen der zweite Parameter ein Slice zu griff wäre weil man dann einfach gleich folgendes schreiben könnte:
Wer hat denn davon gesprochen Strings mutabel zu machen?
Keiner. Du sagtest aber das negative Zahlen konsistenter wären, was einem slicing gleich kämme. Das wäre die Schlussfolgerung daraus:
Code: Alles auswählen
>>>"a|b|c|d".replace('|', '_', 3)
"a|b_c|d" # Das würde rauskommen wenn auf Index 3 ein | Vorhanden ist. Also wäre es äquivalente mit...
>>>if "a|b|c|d"[3] == '|': "a|b|c|d"[3] = '_'
Oder haben wir gerade ein Missverständnis?
EDIT: Fehler im Beispiel beseitigt!
Verfasst: Mittwoch 3. Januar 2007, 13:31
von sape
Mit negativen Index würde das dann rauskomemn:
Slicing -> und das hat dann mit der eigentlichen Funktion, so wie sie vorher war, nichts mehr zu tun.
Verfasst: Mittwoch 3. Januar 2007, 13:34
von sape
OK, stimmt -> String nicht mutable. Dann so ->
Code: Alles auswählen
test = "a|b|c|d"
if test[3] == '|':
test = test[0:3] + '_' + test[3:]
print test
Verfasst: Mittwoch 3. Januar 2007, 14:47
von mawe
*räusper*
Code: Alles auswählen
>>>"a|b|c|d".replace('|', '_', 3)
"a|b_c|d" # Das würde rauskommen wenn auf Index 3 ein | Vorhanden ist. Also wäre es äquivalente mit...
>>>if "a|b|c|d"[3] == '|': "a|b|c|d"[3] = '_'
Ich hab's eigentlich so gemeint, dass der 3. Parameter das x-te Pattern ist das ersetzt wird. HÄ?!? Ich sollte ein Buch schreiben, ich kann wunderbar formulieren
Hier wird also das 2. "x" ersetzt. Um konsistent zu bleiben, müsste es eigentlich "1" sein, weil man ja bei "0" beginnt ... *kopfrauch*
Man könnte dann mit 4. und 5. Parameter eine Art range machen:
Code: Alles auswählen
>>> "xaxbxcxdxexfxgx".replace("x", "_", 1, 6, 2)
xa_bxc_dxe_fxgx
Na, wäre das nicht toll ... ich schreib Guido gleich mal eine mail mit meinem Vorschlag, der is sicher begeistert

Verfasst: Mittwoch 3. Januar 2007, 15:21
von sape
Ne ist schon OK

Wenn sich keiner die mühe machen will mich zu verstehen, dann eben nicht! Anscheinend habe ich hier, egal was ich sage, immer unrecht und ihr recht und verdreht meine Aussagen immer so wie ich das garnicht meinte. Seis drum.

Verfasst: Mittwoch 3. Januar 2007, 15:23
von sape
EDIT: -.-
Bin raus!
Verfasst: Mittwoch 3. Januar 2007, 15:32
von mawe
Was isn bitte jetzt los?! Und wo hab ich dir die Worte im Mund gedreht?
Ich weiss wie replace funktioniert. Was ich gepostet habe, war, wie ich mir mein Wunsch-replace vorstelle. Jetzt hab ich noch mal erklärt wie das genau aussehen würde.
Verfasst: Mittwoch 3. Januar 2007, 15:36
von sape
Ja, sry habe mein Post bevor du den Post abgeschickt hast schon wider editiert

Bin heute wohl ein wenig geknickt. Sorry :-[

Verfasst: Mittwoch 3. Januar 2007, 15:41
von sape
mawe hat geschrieben:
Man könnte dann mit 4. und 5. Parameter eine Art range machen:
Code: Alles auswählen
>>> "xaxbxcxdxexfxgx".replace("x", "_", 1, 6, 2)
xa_bxc_dxe_fxgx
OK, damit könnte ich mich auch anfreunden mit nem range. Aber wozu ist dann noch der dritte Parameter gut?

der 4 und 5 reicht doch dann. Oder ich habs doch nicht verstanden ^^ Aber wie willst du damit realisieren das er auch von rückwärts anfängt? Mit negativen Indexen? Geht das überhaupt in nem range? -> Gleich mal testen ^^