Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中,如何在不翻译单个字符的情况下实现多重替换?_Python_Python 2.7 - Fatal编程技术网

在Python中,如何在不翻译单个字符的情况下实现多重替换?

在Python中,如何在不翻译单个字符的情况下实现多重替换?,python,python-2.7,Python,Python 2.7,我试图用字典翻译多个字符串;然而,它总是替换每个单独的字符,我不知道如何调整我的代码 我的字典: {"You're": "I'm", "We've": "you've", 'am': 'are', "We'll": "you'll", 'im': "you're", "we'd": "you'd", 'our': 'your', 'You': 'I', 'Was': 'were', 'your': 'my', "you're": "I'm", 'We': 'you', "I've": "you'

我试图用字典翻译多个字符串;然而,它总是替换每个单独的字符,我不知道如何调整我的代码

我的字典:

{"You're": "I'm", "We've": "you've", 'am': 'are', "We'll": "you'll", 'im': "you're",
"we'd": "you'd", 'our': 'your', 'You': 'I', 'Was': 'were', 'your': 'my', "you're":
"I'm", 'We': 'you', "I've": "you've", "we've": "you've", 'This': 'that', "we're":
"you're", 'you': 'I', 'was': 'were', 'me': 'you', 'we': 'you', 'I': 'you', 'c': 'see',
"I'd": "you'd", 'Were': 'was', "I'm": "you're", 'My': 'your', "I'll": "you'll", "we'll":
"you'll", 'this': 'that', 'Am': 'are', 'ur': "I'm", 'i': 'you', 'u': 'me', "We'd":
"you'd", 'were': 'was', 'Our': 'your', "i'm": "you're", 'my': 'your', 'Your': 'my',
"We're": "you're"}
我的代码:

def replace_all(text, dic):
    for i, j in dic.iteritems():
        text = text.replace(i, j)
    return text
稍后由以下人员调用:

message = replace_all(message, dictionary)
可以替换字符串中的整个单词吗?我对python非常陌生,因此非常感谢您的帮助

如果没有任何替换项重叠,那么效果很好,但是如果您有这样的替换项,您可以:

{'I': 'you', 'you': 'I'}
然后以前的替换会再次被替换,这是不可取的。他的答案的一小部分扩展修正了以下问题:

import re

def replace_all(text, dic):
    words = sorted(dic, key=len, reverse=True)
    return re.sub('\\b(' + '|'.join(map(re.escape, words)) + ')\\b',
                  lambda m: dic[m.group(0)], text)
首先创建一个如下所示的正则表达式:

\b(you|I)\b
如中所述,\b代表单词boundary1。因此,它将只匹配单词边界的内部部分。|表示正则表达式括号内的多个选项。有必要根据长度对选项进行反向排序,因为Python将在第一个选项匹配时立即停止;如果我以前是,比如说,我是,那么它永远不会匹配我是,因为我总是在我之前匹配

所以我们将正则表达式传递给,它不仅可以作为替换字符串,还可以作为函数,允许更复杂的逻辑。我们的函数在字典中查找匹配的文本,并返回与该键关联的值作为要替换的文本

1不幸的是,“单词”的定义在括号中并不明智,因此:

>>> replace_all("I'm not convinced.", {"I": "you"})
"you'm not convinced."
幸运的是,因为我们对它进行了排序,所以最长的匹配总是首先发生:

>>> replace_all("I'm not convinced.", {"I": "you", "I'm": "you're"})
"you're not convinced."
如果没有任何替换项重叠,则效果很好,但如果您有这样的替换项,您可以:

{'I': 'you', 'you': 'I'}
然后以前的替换会再次被替换,这是不可取的。他的答案的一小部分扩展修正了以下问题:

import re

def replace_all(text, dic):
    words = sorted(dic, key=len, reverse=True)
    return re.sub('\\b(' + '|'.join(map(re.escape, words)) + ')\\b',
                  lambda m: dic[m.group(0)], text)
首先创建一个如下所示的正则表达式:

\b(you|I)\b
如中所述,\b代表单词boundary1。因此,它将只匹配单词边界的内部部分。|表示正则表达式括号内的多个选项。有必要根据长度对选项进行反向排序,因为Python将在第一个选项匹配时立即停止;如果我以前是,比如说,我是,那么它永远不会匹配我是,因为我总是在我之前匹配

所以我们将正则表达式传递给,它不仅可以作为替换字符串,还可以作为函数,允许更复杂的逻辑。我们的函数在字典中查找匹配的文本,并返回与该键关联的值作为要替换的文本

1不幸的是,“单词”的定义在括号中并不明智,因此:

>>> replace_all("I'm not convinced.", {"I": "you"})
"you'm not convinced."
幸运的是,因为我们对它进行了排序,所以最长的匹配总是首先发生:

>>> replace_all("I'm not convinced.", {"I": "you", "I'm": "you're"})
"you're not convinced."

这绝对是一个进步!然而,它似乎仍在翻译中间词。例如,测试的预期结果是你认为我只是一台机器?它还说你以为我是马西胡恩?@ShaunGillies:哦,天哪,你说得对。我忘了一些括号。现在试试吧,尽管它可能仍然有撇号的问题…就是这样!非常感谢。如果不太麻烦的话,您能不能快速解释一下代码中发生了什么?我不想再碰到这堵墙了,因为我不会真正了解代码。@ShaunGillies:当然!我给我的答案加了一点解释。@Shaungilles:在改进我的解释时,我发现了一个小错误。这在我的答案的最新编辑中被修正了。这绝对是一个进步!然而,它似乎仍在翻译中间词。例如,测试的预期结果是你认为我只是一台机器?它还说你以为我是马西胡恩?@ShaunGillies:哦,天哪,你说得对。我忘了一些括号。现在试试吧,尽管它可能仍然有撇号的问题…就是这样!非常感谢。如果不太麻烦的话,您能不能快速解释一下代码中发生了什么?我不想再碰到这堵墙了,因为我不会真正了解代码。@ShaunGillies:当然!我给我的答案加了一点解释。@Shaungilles:在改进我的解释时,我发现了一个小错误。这在我的答案的最新编辑中被修正了。