【问题标题】:Easiest way to replace a string using a dictionary of replacements?使用替换字典替换字符串的最简单方法?
【发布时间】:2011-01-24 22:09:38
【问题描述】:

考虑..

dict = {
'Спорт':'Досуг',
'russianA':'englishA'
}

s = 'Спорт russianA'

我想用 s 中各自的 dict 值替换所有 dict 键。

【问题讨论】:

  • 这可能不是那么简单。您可能应该有一个明确的标记器(例如{'cat': 'russiancat'} 和“caterpillar”)。还有重叠的词({'car':'russiancar', 'pet' : 'russianpet'} 和“地毯”)。
  • 顺便说一句:我认为最好避免将dict 用作变量名,因为此名称的变量会影响同名的内置函数。

标签: python regex


【解决方案1】:

如果 key 有空间则会失败的警告,这是一个类似于 ghostdog74 和 extaneons 答案的压缩解决方案:

d = {
'Спорт':'Досуг',
'russianA':'englishA'
}

s = 'Спорт russianA'

' '.join(d.get(i,i) for i in s.split())

【讨论】:

    【解决方案2】:

    我在类似的情况下使用过这个(我的字符串都是大写的):

    def translate(string, wdict):
        for key in wdict:
            string = string.replace(key, wdict[key].lower())
        return string.upper()
    

    希望能在某种程度上有所帮助... :)

    【讨论】:

    • 这与 ChristopheD 的解决方案非常相似。你不同意他的观点吗?
    【解决方案3】:

    您可以使用reduce 函数:

    reduce(lambda x, y: x.replace(y, dict[y]), dict, s)
    

    【讨论】:

    • 与@Max Shawabkeh 的解决方案不同,使用reduce 一个接一个地应用替换。因此,使用字典 { 'red': 'green', 'green': 'red'} 交换单词不适用于基于 reduce 的方法,并且重叠匹配会以不可预知的方式转换。
    • 一个很好的例子说明为什么重复调用.replace() 可能会产生意想不到的后果:html.replace('"', '"').replace('&', '&') — 试试html = '"foo"'
    • ChristopheDuser2769207 的答案中所示的展开循环相比,这是不必要的复杂和不可读。
    【解决方案4】:

    使用回复:

    import re
    
    s = 'Спорт not russianA'
    d = {
    'Спорт':'Досуг',
    'russianA':'englishA'
    }
    
    pattern = re.compile(r'\b(' + '|'.join(d.keys()) + r')\b')
    result = pattern.sub(lambda x: d[x.group()], s)
    # Output: 'Досуг not englishA'
    

    这将只匹配整个单词。如果您不需要,请使用以下模式:

    pattern = re.compile('|'.join(d.keys()))
    

    请注意,在这种情况下,如果您的某些字典条目是其他条目的子字符串,您应该按长度降序对单词进行排序。

    【讨论】:

    • 如果字典键包含“^”、“$”和“/”等字符,则在组装正则表达式之前需要对键进行转义。为此,.join(d.keys()) 可以替换为 .join(re.escape(key) for key in d.keys())
    • 请注意,第一个示例(Досуг 不是englishA)仅适用于python3。在 python2 中它仍然返回“Спорт not englishA”
    • 当 dict 中的单词有点时,它似乎失败了 - https://regex101.com/r/bliVUS/1 - 我需要在最后删除 \b 但不确定它是否正确。
    【解决方案5】:

    解决方案found here(我喜欢它的简单性):

    def multipleReplace(text, wordDict):
        for key in wordDict:
            text = text.replace(key, wordDict[key])
        return text
    

    【讨论】:

    • 同样,正如@jochen 所描述的,如果有一个键也是一个值,那么这可能会导致翻译错误。最好单次替换。
    【解决方案6】:

    几乎和ghostdog74一样,虽然是独立创建的。一区别, 使用 d.get() 代替 d[] 可以处理字典中没有的项目。

    >>> d = {'a':'b', 'c':'d'}
    >>> s = "a c x"
    >>> foo = s.split()
    >>> ret = []
    >>> for item in foo:
    ...   ret.append(d.get(item,item)) # Try to get from dict, otherwise keep value
    ... 
    >>> " ".join(ret)
    'b d x'
    

    【讨论】:

      【解决方案7】:

      一种方式,无需重复

      d = {
      'Спорт':'Досуг',
      'russianA':'englishA'
      }
      
      s = 'Спорт russianA'.split()
      for n,i in enumerate(s):
          if i in d:
              s[n]=d[i]
      print ' '.join(s)
      

      【讨论】:

      • 如果字典的键中有空格,这将失败
      猜你喜欢
      • 1970-01-01
      • 2010-09-18
      • 2012-09-25
      • 1970-01-01
      • 1970-01-01
      • 2011-10-16
      相关资源
      最近更新 更多