Warum gibt es kein "".replace dass...

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.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

[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]
Costi
User
Beiträge: 545
Registriert: Donnerstag 17. August 2006, 14:21

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...
cp != mv
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

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.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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 :D

Code: Alles auswählen

"foobar(abc) abc"[::-1].replace("abc"[::-1], "xyz"[::-1], 1)[::-1]
BlackJack

Von dem ganzen Zeichenketten-Umdrehen wird einem ja ganz schwindelig. :-)
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

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.
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

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 ... :)
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ich denke mit negativen Zahlen wäre das konsistenter. Schließlich funktionieren Slices genau so.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

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:

Code: Alles auswählen

if "a|b|c|d"[1] == '|': "a|b|c|d"[1] = '_'
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.

Code: Alles auswählen

>>>"a|b|c|d".rreplace('|', '_', 1)
"a|b|c_d"
EDIT: Fehler beseitigt.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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:

Code: Alles auswählen

if "a|b|c|d"[1] == '|': "a|b|c|d"[1] = '_'
Wer hat denn davon gesprochen Strings mutabel zu machen?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

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:

Code: Alles auswählen

if "a|b|c|d"[1] == '|': "a|b|c|d"[1] = '_'
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!
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Mit negativen Index würde das dann rauskomemn:

Code: Alles auswählen

>>>"a|b|c|d".replace('|', '_', -2)
"a|b|c_d" 
Slicing -> und das hat dann mit der eigentlichen Funktion, so wie sie vorher war, nichts mehr zu tun.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

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
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

*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 :)

Code: Alles auswählen

 >>> "x a x b x".replace("x", "_", 2)
x a _ b x
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 :D
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

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. ;) :idea:
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

EDIT: -.-

Bin raus!
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

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.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Ja, sry habe mein Post bevor du den Post abgeschickt hast schon wider editiert :oops: Bin heute wohl ein wenig geknickt. Sorry :-[ :oops:
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

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 ^^
Antworten