can you write a str.replace() using dictionary values in Python?

后端 未结 10 846
小鲜肉
小鲜肉 2020-12-03 00:20

I have to replace the north, south, etc with N S in address fields.

If I have

list = {\'NORTH\':\'N\',\'SOUTH\':\'S\',\'EAST\':\'E\',\'WEST\':\'W\'}         


        
10条回答
  •  一整个雨季
    2020-12-03 01:16

    Both using replace() and format() are not so precise:

    data =  '{content} {address}'
    for k,v in {"{content}":"some {address}", "{address}":"New York" }.items():
        data = data.replace(k,v)
    # results: some New York New York
    
    '{ {content} {address}'.format(**{'content':'str1', 'address':'str2'})
    # results: ValueError: unexpected '{' in field name
    

    It is better to translate with re.sub() if you need precise place:

    import re
    def translate(text, kw, ignore_case=False):
        search_keys = map(lambda x:re.escape(x), kw.keys())
        if ignore_case:
            kw = {k.lower():kw[k] for k in kw}
            regex = re.compile('|'.join(search_keys), re.IGNORECASE)
            res = regex.sub( lambda m:kw[m.group().lower()], text)
        else:
            regex = re.compile('|'.join(search_keys))
            res = regex.sub( lambda m:kw[m.group()], text)
    
        return res
    
    #'score: 99.5% name:%(name)s' %{'name':'foo'}
    res = translate( 'score: 99.5% name:{name}', {'{name}':'foo'})
    print(res)
    
    res = translate( 'score: 99.5% name:{NAME}', {'{name}':'foo'}, ignore_case=True)
    print(res)
    

提交回复
热议问题