使用替换词典替换字符串的最简单方法是什么?

med*_*iev 71 python regex

考虑..

dict = {
'?????':'?????',
'russianA':'englishA'
}

s = '????? russianA'
Run Code Online (Sandbox Code Playgroud)

我想用它们各自的dict值替换所有dict键s.

Max*_*keh 91

使用re:

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'
Run Code Online (Sandbox Code Playgroud)

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

pattern = re.compile('|'.join(d.keys()))
Run Code Online (Sandbox Code Playgroud)

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

  • 如果字典键包含"^","$"和"/"等字符,则在组装正则表达式之前需要对键进行转义.要做到这一点,`.join(d.keys())`可以替换为`.join(d.keys()中的键的re.escape(key))`. (23认同)

cod*_*ape 23

你可以使用reduce函数:

reduce(lambda x, y: x.replace(y, dict[y]), dict, s)
Run Code Online (Sandbox Code Playgroud)

  • 与@Max Shawabkeh的解决方案不同,使用`reduce`一个接一个地应用替换.因此,使用字典"{'red':'green','green':'red'}`交换单词不适用于基于`reduce`的方法,重叠匹配以不可预测的方式进行转换. (16认同)
  • 一个很好的例子说明为什么重复`.replace()`调用可能会产生意想不到的后果:`html.replace('"','"').replace('&','&')`-try it on` html ='"foo"'` (2认同)

Chr*_*heD 17

解决方案在这里找到(我喜欢它的简单性):

def multipleReplace(text, wordDict):
    for key in wordDict:
        text = text.replace(key, wordDict[key])
    return text
Run Code Online (Sandbox Code Playgroud)

  • 同样,正如@jochen所描述的那样,如果存在一个也是一个值的密钥,则会导致翻译错误.单程更换最好. (10认同)

gho*_*g74 5

一种方式,没有重新

d = {
'?????':'?????',
'russianA':'englishA'
}

s = '????? russianA'.split()
for n,i in enumerate(s):
    if i in d:
        s[n]=d[i]
print ' '.join(s)
Run Code Online (Sandbox Code Playgroud)

  • 如果dict的键中有空格,则会失败 (2认同)