删除字符串中的字符列表

发布于 2021-01-29 16:07:56

我想在python中删除字符串中的字符:

string.replace(',', '').replace("!", '').replace(":", '').replace(";", '')...

但是我必须删除许多字符。我想到了一个清单

list = [',', '!', '.', ';'...]

但是,如何使用list来替换中的字符string

关注者
0
被浏览
52
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    如果您使用的是python2并且您的输入是字符串(不是Unicode),则绝对最佳的方法是str.translate

    >>> chars_to_remove = ['.', '!', '?']
    >>> subj = 'A.B!C?'
    >>> subj.translate(None, ''.join(chars_to_remove))
    'ABC'
    

    否则,可以考虑以下选项:

    A.通过char迭代主题char,省略不需要的字符和join结果列表:

    >>> sc = set(chars_to_remove)
    >>> ''.join([c for c in subj if c not in sc])
    'ABC'
    

    (请注意,生成器版本的''.join(c for c ...)效率较低)。

    B.动态创建一个正则表达式,并re.sub带有一个空字符串:

    >>> import re
    >>> rx = '[' + re.escape(''.join(chars_to_remove)) + ']'
    >>> re.sub(rx, '', subj)
    'ABC'
    

    re.escape确保字符喜欢^]不会破坏正则表达式)。

    C.使用以下映射的变体translate

    >>> chars_to_remove = [u'δ', u'Γ', u'ж']
    >>> subj = u'AжBδCΓ'
    >>> dd = {ord(c):None for c in chars_to_remove}
    >>> subj.translate(dd)
    u'ABC'
    

    完整的测试代码和时间安排:

    #coding=utf8
    
    import re
    
    def remove_chars_iter(subj, chars):
        sc = set(chars)
        return ''.join([c for c in subj if c not in sc])
    
    def remove_chars_re(subj, chars):
        return re.sub('[' + re.escape(''.join(chars)) + ']', '', subj)
    
    def remove_chars_re_unicode(subj, chars):
        return re.sub(u'(?u)[' + re.escape(''.join(chars)) + ']', '', subj)
    
    def remove_chars_translate_bytes(subj, chars):
        return subj.translate(None, ''.join(chars))
    
    def remove_chars_translate_unicode(subj, chars):
        d = {ord(c):None for c in chars}
        return subj.translate(d)
    
    import timeit, sys
    
    def profile(f):
        assert f(subj, chars_to_remove) == test
        t = timeit.timeit(lambda: f(subj, chars_to_remove), number=1000)
        print ('{0:.3f} {1}'.format(t, f.__name__))
    
    print (sys.version)
    PYTHON2 = sys.version_info[0] == 2
    
    print ('\n"plain" string:\n')
    
    chars_to_remove = ['.', '!', '?']
    subj = 'A.B!C?' * 1000
    test = 'ABC' * 1000
    
    profile(remove_chars_iter)
    profile(remove_chars_re)
    
    if PYTHON2:
        profile(remove_chars_translate_bytes)
    else:
        profile(remove_chars_translate_unicode)
    
    print ('\nunicode string:\n')
    
    if PYTHON2:
        chars_to_remove = [u'δ', u'Γ', u'ж']
        subj = u'AжBδCΓ'
    else:
        chars_to_remove = ['δ', 'Γ', 'ж']
        subj = 'AжBδCΓ'
    
    subj = subj * 1000
    test = 'ABC' * 1000
    
    profile(remove_chars_iter)
    
    if PYTHON2:
        profile(remove_chars_re_unicode)
    else:
        profile(remove_chars_re)
    
    profile(remove_chars_translate_unicode)
    

    结果:

    2.7.5 (default, Mar  9 2014, 22:15:05) 
    [GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)]
    
    "plain" string:
    
    0.637 remove_chars_iter
    0.649 remove_chars_re
    0.010 remove_chars_translate_bytes
    
    unicode string:
    
    0.866 remove_chars_iter
    0.680 remove_chars_re_unicode
    1.373 remove_chars_translate_unicode
    
    ---
    
    3.4.2 (v3.4.2:ab2c023a9432, Oct  5 2014, 20:42:22) 
    [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)]
    
    "plain" string:
    
    0.512 remove_chars_iter
    0.574 remove_chars_re
    0.765 remove_chars_translate_unicode
    
    unicode string:
    
    0.817 remove_chars_iter
    0.686 remove_chars_re
    0.876 remove_chars_translate_unicode
    

    (作为一个旁注,该数字remove_chars_translate_bytes可能为我们提供了一个线索,说明为什么该行业这么长时间不愿采用Unicode)。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看