2017-09-04 2 views
1

ich versuche, eine Python-Funktion zu vereinen, aber es scheint keine der Zeichen innerhalb der Funktion zu ersetzen. obwohl die Funktion funktionieren sollte?Ersetzen von Sonderzeichen in einer Zeichenfolge

Fehlermeldung:

E  AssertionError: assert 'TE/ST-' == 'AEOEAA_TE_ST_' 
E   - æøå TE/ST- 
E   + AEOEAA_TE_ST_ 

Funktion

class Formatter(object): 

    @classmethod 
    def string(self, string): 

     new_string = string.upper() 


     # split cases 
     new_string.replace(' ', '_') 
     new_string.replace('-', '_') 
     new_string.replace('/', '_') 

     # chars 
     new_string.replace('Ø', 'OE') 
     new_string.replace('Å', 'AA') 
     new_string.replace('Æ', 'AE') 

     return new_string 

Test

def test_formatter(): 
    test = Formatter.string('æøå te/st-') 
    assert test.decode('utf-8') == 'AEOEAA_TE_ST_' 
+0

In Python 2 markieren Sie Ihre Unicode-Strings immer richtig: 'u'Ø''. –

Antwort

4

str.replace ist nicht in-place-Funktion, das heißt, wenn Sie es nennen, es gibt einen Wert zurück, den Sie der ursprünglichen Variablen zuweisen müssen, andernfalls werden die Änderungen nicht angezeigt. Als Beispiel betrachten:

In [315]: string = 'æøå te/st-'.upper() 

Jetzt .replace, rufen:

In [316]: string.replace('Ø', 'OE') 
Out[316]: 'ÆOEÅ TE/ST-' 

In [317]: string 
Out[317]: 'ÆØÅ TE/ST-' 

Keine Änderung. Probieren Sie es jetzt zurück zuweisen:

In [318]: string = string.replace('Ø', 'OE') 

In [319]: string 
Out[319]: 'ÆOEÅ TE/ST-' 

Als schnellere Alternative, sollten Sie die Verwendung von str.translate. Wenn Sie auf Python3 sind, können Sie eine Wörterbuchzuordnung von Ersetzungen übergeben (auf Python2 ist dies nicht möglich).

class Formatter(object):  
    @classmethod 
    def string(self, strn): 
     tab = dict.fromkeys(' -/', '_') 
     tab.update({'Ø' : 'OE', 'Å' : 'AA', 'Æ' : 'AE'}) 

     return strn.upper().translate(str.maketrans(tab)) 

Für python2, könnten Sie mit str.replace halten wählen.

+1

nice one, gerade entdeckt 'str.translate', danke! – Netwave

+0

AttributeError: 'str' Objekt hat kein Attribut 'maketrans' –

+0

@PeterPik Ja, ich habe bemerkt, dass du auf Python2 bist und habe es geändert. –

Verwandte Themen