替换字符串中的特殊字符

Pet*_*Pik 1 python string replace python-2.7

我正在尝试对 python 函数进行单元测试,但它似乎没有替换函数内的任何字符。即使该功能应该工作?

错误信息:

E       AssertionError: assert 'TE/ST-' == 'AEOEAA_TE_ST_'
E         - æøå TE/ST-
E         + AEOEAA_TE_ST_
Run Code Online (Sandbox Code Playgroud)

功能

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
Run Code Online (Sandbox Code Playgroud)

测试

def test_formatter():
    test = Formatter.string('æøå te/st-')
    assert test.decode('utf-8') == 'AEOEAA_TE_ST_'
Run Code Online (Sandbox Code Playgroud)

cs9*_*s95 5

str.replace不是就地函数,这意味着当你调用它时,它返回一个你必须分配回原始变量的值,否则将看不到更改。例如,请考虑:

In [315]: string = 'æøå te/st-'.upper()
Run Code Online (Sandbox Code Playgroud)

现在,调用.replace:

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

In [317]: string
Out[317]: 'ÆØÅ TE/ST-'
Run Code Online (Sandbox Code Playgroud)

没变。现在尝试重新分配它:

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

In [319]: string
Out[319]: 'ÆOEÅ TE/ST-'
Run Code Online (Sandbox Code Playgroud)

作为更快的替代方案,请考虑使用str.translate. 如果您使用的是 python3,则可以传递替换的字典映射(您不能在 python2 上执行此操作)。

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

        return strn.upper().translate(str.maketrans(tab))
Run Code Online (Sandbox Code Playgroud)

对于 python2,你可以选择坚持使用str.replace.