用Dictionary [Python]替换其他字符串的字符串

时间:2015-08-14 02:06:29

标签: python dictionary

我必须能够接受用户输入并使用提供的字典为原始输入中找到的任何字符/单词更改输入。但是,我遇到的问题是它将使用字典中的其他键替换单词的子集。

例如,顺便说一句,btw应该成为'而是变成了“哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇因为该功能将重复翻译文本。 y in by变成'为什么'而y的方式变成了为什么'。

my_dict = {'gr8': 'great', 'btw': 'by the way', 'imho': 'in my humble opinion',
       'jk': 'just kidding', 'l8r': 'later', 'np': 'no problem', 'r': 'are', 'u': 'you',
       'y': 'why', 'ttyl': 'talk to you later', 'l8': 'late', 'atm': 'at the moment',
       'lmk': 'let me know', 'np': 'no problem', 'tia': 'thanks in advance',
       'brb': 'be right back'}

def translate(text, my_dict):
for key in my_dict:
    text = text.replace(key, my_dict[key])
return text

def main():
phrase = raw_input("Enter message to translate: ")
translation = translate(phrase,my_dict)
print "Translated message: %s" % translation

main()

我宁愿不介绍新的功能/方法。我知道这可以用re来完成,但我不想依赖它。

3 个答案:

答案 0 :(得分:0)

您可以使用text拆分str.split(),然后对于文本中的每个单词,从dict获取其值,或者如果不存在此值,则直接获取该单词。< / p>

您可以使用dict.get(),并将单词本身作为第二个参数提供(第二个参数表示如果该键不存在则传回的默认值)。

代码 -

def translate(text, dict):
    texts = text.split()
    return ' '.join(dict.get(word,word) for word in texts)

此外,您不应使用dict作为变量名,因为它也是内置函数的名称来创建字典,并使用该变量名称隐藏内置函数。

示例/演示 -

>>> def translate(text, dict):
...     texts = text.split()
...     return ' '.join(dict.get(word,word) for word in texts)
...
>>> def main():
...     phrase = input("Enter message to translate: ")
...     translation = translate(phrase,dict)
...     print("Translated message: %s" % translation)
...
>>> dict = {'gr8': 'great', 'btw': 'by the way', 'imho': 'in my humble opinion',
...        'jk': 'just kidding', 'l8r': 'later', 'np': 'no problem', 'r': 'are', 'u': 'you',
...        'y': 'why', 'ttyl': 'talk to you later', 'l8': 'late', 'atm': 'at the moment',
...        'lmk': 'let me know', 'np': 'no problem', 'tia': 'thanks in advance',
...        'brb': 'be right back'}
>>>
>>>
>>> main()
Enter message to translate: Hello brb abtw
Translated message: Hello be right back abtw

答案 1 :(得分:0)

此版本的translate方法将完成此任务:

def translate(text, dict):
        for key in dict:
                if ' '+key in text or text.startswith(key):
                        text = text.replace(key, dict[key])
        return text

解释:正常的英语句子在任何有意义的单词之前都会有whitespaces。因此,它检查是否存在空格或者句子是否以关键字本身开头(在这种情况下,它之前没有空格)。

输入:btw that was a gr8 day!

输出:by the way that was a great day!

答案 2 :(得分:0)

如果您想在不分割的情况下进行替换,则必须使用带有字边界的正则表达式:

from re import sub
def translate(text, my_dict):
    for key in my_dict:
        text = sub(r"\bkey\b", my_dict[key], text)
    return text

您还可以在dict中编译模式以加快替换:

import re

for k, v in my_dict.items():
    my_dict[re.compile(r"\b{}\b".format(k))] = v
    del my_dict[k]

def translate(text, my_dict):
    for key, v in my_dict.items():
        text = key.sub(v, text)
    return text

def main():
    phrase = raw_input("Enter message to translate: ")
    translation = translate(phrase,my_dict)
    print "Translated message: %s" % translation

输出:

Enter message to translate: btw
Translated message: by the way

如果你要拆分你应该通过分隔符来保留空格,保留不在你的字典中的单词,或者如果它们在dict中则用my_dict[word]替换它们:

def translate(text, my_dict):
    text = text.split(" ")
    return "".join([my_dict[word] if word in text else word for word in text])

def main():
    phrase = raw_input("Enter message to translate: ")
    translation = translate(phrase,my_dict)
    print "Translated message: %s" % translation

main()

输出:

Enter message to translate: btw
Translated message: by the way