【问题标题】:Python string replacement [duplicate]Python字符串替换[重复]
【发布时间】:2016-06-06 13:37:06
【问题描述】:

我正在尝试用另一个单词替换出现的单词:

word_list = { "ugh" : "disappointed"}

tmp = ['laughing ugh']

for index, data in enumerate(tmp):
    for key, value in word_list.iteritems():
        if key in data:
            tmp[index]=data.replace(key, word_list[key])

print tmp

虽然这可行... ughlaughing 中的出现也被替换在输出中:ladisappointeding disappointed.

如何避免这种情况,以便输出为laughing disappointed

【问题讨论】:

  • 用空格分割字符串。只替换完全匹配

标签: python string


【解决方案1】:

在这种情况下,您可能需要考虑逐字替换。

示例:

word_list = { "ugh" : "disappointed"}
tmp = ['laughing ugh']

for t in tmp:
    words = t.split()
    for i in range(len(words)):
        if words[i] in word_list.keys():
            words[i] = word_list[words[i]]
    newline = " ".join(words)
    print(newline)

输出:

laughing disappointed

分步说明:

  1. 获取tmp中的每一句话list:

    for t in tmp:
    
  2. 将句子拆分成words:

    words = t.split()
    
  3. 检查words 中的word 是否在word_list keys 中。如果是,请将其替换为 value:

    for i in range(len(words)):
        if words[i] in word_list.keys():
            words[i] = word_list[words[i]]
    
  4. 重新加入替换的单词并打印结果:

    newline = " ".join(words)
    print(newline)
    

【讨论】:

    【解决方案2】:

    您可以使用 RegEx 来做到这一点:

    >>> import re
    >>> re.sub(r'\bugh\b', 'disappointed', 'laughing ugh')
    'laughing disappointed'
    

    \b 代表单词边界。

    【讨论】:

      【解决方案3】:

      使用re.sub:

      for key, value in word_list.items():
          tmp = re.sub("\\b{}\\b".format(key), value, tmp[index])
      

      【讨论】:

        【解决方案4】:
        word_list = { "ugh" : "disappointed", "123" : "lol"}
        tmp = ['laughing 123 ugh']
        
        for word in tmp:
            words = word.split()
        for i in words[:]:
            if  i in word_list.keys():
            replace_value = word_list.get(i)
            words[words.index(i)] = replace_value
        output = " ".join(words)
        print output
        

        此代码将在每种情况下将字典的每个键(即您要替换的单词)与该键的字典值(您要替换的单词)交换多个值!

        Output:
            laughing lol disappointed
        

        希望有帮助!

        【讨论】:

          【解决方案5】:

          你可以使用正则表达式:

          import re
          
          for index, data in enumerate(tmp):
              for key, value in word_list.iteritems():
                  if key in data:
                      pattern = '\b' + key + '\b'
                      data = re.sub(pattern, value, data)
                      tmp[index] = data
          

          旁注:您需要data = ... 行(以覆盖data 变量)否则当word_list 包含多个条目时它将无法正常工作。

          【讨论】:

            【解决方案6】:

            快速:

            >>> [re.sub(r'\w+', lambda m: word_list.get(m.group(), m.group()), t) 
                 for t in tmp]
            ['laughing disappointed']
            >>> 
            

            非常快:

            >>> [re.sub(r'\b(?:%s)\b' % '|'.join(word_list.keys()), lambda m: word_list.get(m.group(), m.group()), t) 
            ...  for t in tmp]
            ['laughing disappointed']
            >>> 
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-09-11
              • 1970-01-01
              • 1970-01-01
              • 2018-11-26
              相关资源
              最近更新 更多