【问题标题】:Replace word, but another word with same letter format got replaced替换单词,但替换了具有相同字母格式的另一个单词
【发布时间】:2021-10-17 22:39:36
【问题描述】:

我试图在 python 中替换一个单词,但是另一个具有相同字母格式的单词被替换了

示例:

initial        : 'bg bgt'
goal           : 'bang banget'
current result : 'bang bangt'

这是我的代码目前的样子:

def slangwords(kalimat):
    words = kalimat.split(' ')
    for word in words:
        if any(x in word for x in "bg"):
            kalimat = kalimat.replace("bg","bang")

        if any(x in word for x in "bgt"):
            kalimat = kalimat.replace("bgt","banget")
    return kalimat

print(slangwords('bg bgt'))

如果你能告诉我如何更有效和高效地替换这些俚语,我将不胜感激,谢谢

【问题讨论】:

    标签: python python-3.x replace


    【解决方案1】:

    那是因为你在bgt之前替换了bg(这是一个更大的子字符串),你需要改变顺序。

    另外,您不需要if any(x in word for x in "bg"),它会检查单词中是否存在每个字母,而不是检查子字符串是否以相同的顺序出现,另外,在使用str.replace 之前不需要任何验证,如果字符串不存在,它不会做任何事情

    你只需要

    def slangwords(kalimat):
        return kalimat.replace("bgt", "banget").replace("bg", "bang")
    

    更好且不依赖于顺序

    使用字典,并用它的替代词替换每个单词

    def slangwords(kalimat):
        replacements = {
            'bg': 'bang',
            'bgt': 'banget'
        }
        words = kalimat.split(' ')
        for i, word in enumerate(words):
            words[i] = replacements.get(word, word)
        return " ".join(words)
    

    【讨论】:

      【解决方案2】:

      这无疑是使用字典的经典案例——例如

      D = {'bg': 'bang', 'bgt': 'banget'}
      
      
      def slangwords(sentence):
          for word in sentence.split():
              if (rv := D.get(word)) is not None:
                  sentence = sentence.replace(word, rv)
          return sentence
      
      
      if __name__ == '__main__':
          print(slangwords('bg bgt'))
      

      这样俚语() 函数不会改变 - 你所要做的就是扩展你的字典

      【讨论】:

      • 此解决方案可能会遇到类似问题。如果您用另一个单词替换一个缩写词,而这恰好与后面单词中的后续缩写词相匹配,那么您的句子字符串中是否会出现双重(不正确)替换?
      【解决方案3】:

      你只需要颠倒替换的顺序:

      def slangwords(kalimat):
          words = kalimat.split(' ')
          for word in words:
              if any(x in word for x in "bgt"):
                  kalimat = kalimat.replace("bgt","banget")
      
              if any(x in word for x in "bg"):
                  kalimat = kalimat.replace("bg","bang")
          return kalimat
      print(slangwords('bg bgt'))
      

      如果你想替换很多单词,你可以把它们放在字典里(注意这里的顺序也很重要):

      replace_words = { 'bgt' :'banget', 'bg': 'bang'}
      
      def slangwords(kalimat):
          words = kalimat.split(' ')
          for word in words:
            for wrd, repl in replace_words.items():
              kalimat = kalimat.replace(wrd, repl)
          return kalimat
      

      【讨论】:

      • 我正要准确输入这个。我总是喜欢先替换最大的单词/出现
      • 我知道你应该把这两个都换掉,但是语料库里有很多词,所以这需要很长的低效时间。那只是文字的一个例子。无论如何,我可以在不改变这些词的情况下做到这些吗?
      • @AnggiaBagaskara 检查新的更新,应该更高效
      【解决方案4】:

      这是另一种方法。你只需要一本替换字典。使用get enable 来设置jey缺失时的默认值(这里是同一个词)。

      def slangwords(kalimat, sub={'bg': 'bang', 'bgt': 'banget'}):
          return ' '.join([sub.get(w, w) for w in kalimat.split(' ')])
      
      >>> slangwords('bg bgt abc')
      'bang banget abc'
      

      【讨论】:

        猜你喜欢
        • 2015-03-02
        • 1970-01-01
        • 1970-01-01
        • 2014-06-03
        • 1970-01-01
        • 1970-01-01
        • 2020-09-01
        • 2021-06-30
        • 1970-01-01
        相关资源
        最近更新 更多