Best way to replace multiple characters in a string?

前端 未结 14 1780
遇见更好的自我
遇见更好的自我 2020-11-22 11:15

I need to replace some characters as follows: &\\&, #\\#, ...

I coded as follows, but I guess there

相关标签:
14条回答
  • 2020-11-22 11:37

    Maybe a simple loop for chars to replace:

    a = '&#'
    
    to_replace = ['&', '#']
    
    for char in to_replace:
        a = a.replace(char, "\\"+char)
    
    print(a)
    
    >>> \&\#
    
    0 讨论(0)
  • 2020-11-22 11:40

    Simply chain the replace functions like this

    strs = "abc&def#ghi"
    print strs.replace('&', '\&').replace('#', '\#')
    # abc\&def\#ghi
    

    If the replacements are going to be more in number, you can do this in this generic way

    strs, replacements = "abc&def#ghi", {"&": "\&", "#": "\#"}
    print "".join([replacements.get(c, c) for c in strs])
    # abc\&def\#ghi
    
    0 讨论(0)
  • 2020-11-22 11:41

    Using reduce which is available in python2.7 and python3.* you can easily replace mutiple substrings in a clean and pythonic way.

    # Lets define a helper method to make it easy to use
    def replacer(text, replacements):
        return reduce(
            lambda text, ptuple: text.replace(ptuple[0], ptuple[1]), 
            replacements, text
        )
    
    if __name__ == '__main__':
        uncleaned_str = "abc&def#ghi"
        cleaned_str = replacer(uncleaned_str, [("&","\&"),("#","\#")])
        print(cleaned_str) # "abc\&def\#ghi"
    

    In python2.7 you don't have to import reduce but in python3.* you have to import it from the functools module.

    0 讨论(0)
  • 2020-11-22 11:43

    Here is a python3 method using str.translate and str.maketrans:

    s = "abc&def#ghi"
    print(s.translate(str.maketrans({'&': '\&', '#': '\#'})))
    

    The printed string is abc\&def\#ghi.

    0 讨论(0)
  • 2020-11-22 11:46

    FYI, this is of little or no use to the OP but it may be of use to other readers (please do not downvote, I'm aware of this).

    As a somewhat ridiculous but interesting exercise, wanted to see if I could use python functional programming to replace multiple chars. I'm pretty sure this does NOT beat just calling replace() twice. And if performance was an issue, you could easily beat this in rust, C, julia, perl, java, javascript and maybe even awk. It uses an external 'helpers' package called pytoolz, accelerated via cython (cytoolz, it's a pypi package).

    from cytoolz.functoolz import compose
    from cytoolz.itertoolz import chain,sliding_window
    from itertools import starmap,imap,ifilter
    from operator import itemgetter,contains
    text='&hello#hi&yo&'
    char_index_iter=compose(partial(imap, itemgetter(0)), partial(ifilter, compose(partial(contains, '#&'), itemgetter(1))), enumerate)
    print '\\'.join(imap(text.__getitem__, starmap(slice, sliding_window(2, chain((0,), char_index_iter(text), (len(text),))))))
    

    I'm not even going to explain this because no one would bother using this to accomplish multiple replace. Nevertheless, I felt somewhat accomplished in doing this and thought it might inspire other readers or win a code obfuscation contest.

    0 讨论(0)
  • 2020-11-22 11:51

    How about this?

    def replace_all(dict, str):
        for key in dict:
            str = str.replace(key, dict[key])
        return str
    

    then

    print(replace_all({"&":"\&", "#":"\#"}, "&#"))
    

    output

    \&\#
    

    similar to answer

    0 讨论(0)
提交回复
热议问题