Verhält sich replace() hier merkwürdig oder intuitiv?

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
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Code: Alles auswählen

>>> s = 'Spam with ham and eggs'
>>> s.replace('a', 'X')
'SpXm with hXm Xnd eggs'
>>> s.replace('', 'X')
'XSXpXaXmX XwXiXtXhX XhXaXmX XaXnXdX XeXgXgXsX'
Es geht natürlich um die letzte Zeile. Hättet ihr dieses Ergebnis erwartet?

Hintergrund ist übrigens, dass ich gerade dabei bin, das Markieren von Completions via HTML-Tags in meinem kleinen Launchit-Projekt zu implementieren. Die Funktion habe ich folgendermaßen geschrieben:

Code: Alles auswählen

def get_marked_completion(completion, fragment, start_mark, end_mark):
    if not fragment:
        raise ValueError('fragment must be a non-empty string')
    marked_fragment = start_mark + fragment + end_mark
    return completion.replace(fragment, marked_fragment)
Ich mache den Test am Anfang halt, weil ich meine Ausgabe ansonsten recht ungewöhnlich fände, wollte aber gern mal eure Meinung in Bezug auf `replace()` hören.
BlackJack

Ich hätte entweder das oder eine Ausnahme erwartet. Verhält sich auch konsistent mit den Testmethoden:

Code: Alles auswählen

In [139]: 'abc'.index('')
Out[139]: 0

In [140]: 'abc'.startswith('')
Out[140]: True

In [141]: '' in 'abc'
Out[141]: True

In [142]: re.findall('', 'abc')
Out[142]: ['', '', '', '']
Das sorgt zum Beispiel dafür, dass das hier funktioniert:

Code: Alles auswählen

if a in b:
    d = b.replace(a, c)
    assert a != c and b != d
Da wäre man ja schliesslich auch ein wenig überrascht wenn es ein `a` gäbe was zwar in `b` gefunden wird, dass man aber nicht ersetzen kann. Das spräche also gegen eine Ausnahme bei `replace()`. Und die Zusicherung sollte man IMHO auch erwarten dürfen -- was dagegen spräche, dass ein `replace()` mit a == '' einfach nichts machen würde.
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

.. verhält sich auch konsistent zu string.count()

Code: Alles auswählen

In [4]: s
Out[4]: 'hallo'

In [5]: s.count("")
Out[5]: 6
.. string.split() hingegen schmeisst eine exception.

Code: Alles auswählen

In [6]: s.split("")
---------------------------------------------------------------------------
<type 'exceptions.ValueError'>            Traceback (most recent call last)

H:\<ipython console> in <module>()

<type 'exceptions.ValueError'>: empty separator
Meine Erwartung wäre das gleiche Ergebnis wie list(s) gewesen.

Wenn mich jemand vorher gefragt hätte. Hätte ich passen müssen.
Antworten