Replace all the occurrences of specific words

前端 未结 4 1796
暗喜
暗喜 2020-12-11 02:00

Suppose that I have the following sentence:

bean likes to sell his beans

and I want to replace all occurrences of specific words with other

相关标签:
4条回答
  • 2020-12-11 02:13

    If you replace each word one at a time, you might replace words several times (and not get what you want). To avoid this, you can use a function or lambda:

    d = {'bean':'robert', 'beans':'cars'}
    str_in = 'bean likes to sell his beans'
    str_out = re.sub(r'\b(\w+)\b', lambda m:d.get(m.group(1), m.group(1)), str_in)
    

    That way, once bean is replaced by robert, it won't be modified again (even if robert is also in your input list of words).

    As suggested by georg, I edited this answer with dict.get(key, default_value). Alternative solution (also suggested by georg):

    str_out = re.sub(r'\b(%s)\b' % '|'.join(d.keys()), lambda m:d.get(m.group(1), m.group(1)), str_in)
    
    0 讨论(0)
  • 2020-12-11 02:15
    "bean likes to sell his beans".replace("beans", "cars").replace("bean", "robert")
    

    Will replace all instances of "beans" with "cars" and "bean" with "robert". This works because .replace() returns a modified instance of original string. As such, you can think of it in stages. It essentially works this way:

     >>> first_string = "bean likes to sell his beans"
     >>> second_string = first_string.replace("beans", "cars")
     >>> third_string = second_string.replace("bean", "robert")
     >>> print(first_string, second_string, third_string)
    
     ('bean likes to sell his beans', 'bean likes to sell his cars', 
      'robert likes to sell his cars')
    
    0 讨论(0)
  • 2020-12-11 02:18

    If you use regex, you can specify word boundaries with \b:

    import re
    
    sentence = 'bean likes to sell his beans'
    
    sentence = re.sub(r'\bbean\b', 'robert', sentence)
    # 'robert likes to sell his beans'
    

    Here 'beans' is not changed (to 'roberts') because the 's' on the end is not a boundary between words: \b matches the empty string, but only at the beginning or end of a word.

    The second replacement for completeness:

    sentence = re.sub(r'\bbeans\b', 'cars', sentence)
    # 'robert likes to sell his cars'
    
    0 讨论(0)
  • 2020-12-11 02:32

    I know its been a long time but Does this look much more elegant? :

    reduce(lambda x,y : re.sub('\\b('+y[0]+')\\b',y[1],x) ,[("bean","robert"),("beans","cars")],"bean likes to sell his beans")
    
    0 讨论(0)
提交回复
热议问题