Python字典未按要求匹配键

时间:2019-02-27 12:37:34

标签: python dictionary

我有字典。例子

dict = { "wd":"well done", "lol":"laugh out loud"}

问题是,如果文本中有类似"lol?"的内容,则根本不会扩展它。下面是代码,我用来替换字典键:

def contractions(text, contractions_dict=dict):
    for word in text.split():
        if word.lower() in contractions_dict:
            text = text.replace(word, contractions_dict[word.lower()])
    return text

问题是由于'lol''?'之间缺少空格。我该如何解决?

之后,建议的更新代码如下:

 dict1 = {
          "wd":"well done",
          "lol":"laugh out loud"
         }

 def contractions(text, contractions_dict=dict1):
     for key in contractions_dict:
         text = text.replace(key, contractions_dict[key])
     return text

 text = "lol?"
 text=contractions(text)
 print(text)

适用于上面的示例,但长篇幅上,此代码正在取代不需要的内容。

例如,查找老人和团队努力代表了为什么查找老人的想法

这是我获取实际数据的结果的一部分。需要帮忙。

5 个答案:

答案 0 :(得分:1)

您的错误来自拆分文本的方式。 python str.split()的默认大小写会在空白处分割,这意味着“ wtf?”没有分裂。

正如您在documentation中所看到的,str.split()可以接收到要使用的分隔字符的列表。

您可以使用以下方法解决此特定问题:

text.split(sep=[' ', '?'])

但是很可能您希望将更多字符用作分隔点。

答案 1 :(得分:1)

如果您看做反面的话,还有一个更好的解决方案,对于每个键,在整个文本中用该键的值替换:

def contractions(text, contractions_dict=dict):
    for k, v in contractions_dict.items():
        text = text.replace(k,v)
    return text

另外,请注意:

  

请勿使用dict作为变量名,该名称是python内置的,您将覆盖其功能。

示例输入和输出:

In [42]: contractions('this is wd and lol?')
Out[42]: 'this is well done and laugh out loud?'

答案 2 :(得分:1)

与其检查文本是否是字典的一部分,不如遍历字典并检查键是否在文本中。不建议这样做,因为它包含嵌套循环。

def contractions(text, contractions_dict=dict):
    for word in text.split():
        for key in contradictions_dict:
            if key in word:
                text = text.replace(word, contractions_dict[key])
    return text

相反,您可能只想使用replace方法自动替换每次出现的每个键。替换将自动查找并替换单词。无需亲自迭代文本。

def contractions(text, contractions_dict=dict):
    for key in contradictions_dict:
        text = text.replace(key, contractions_dict[key])
    return text

答案 3 :(得分:0)

如前所述,.split()仅在空格处分割,如果您希望从字符串中提取单词和数字,则可以按照以下方式使用re模块执行该任务:

import re
a = 'This, is. (example) for :testing: 123!'
words = re.findall(r'\w+',a)
print(words) #['This', 'is', 'example', 'for', 'testing', '123']

如您所见,它丢弃空格,点,逗号,冒号等,同时保留包含以下内容的序列:字母,数字(和下划线_)。

答案 4 :(得分:0)

您可以使用文本标记器解决问题。 NLTK库提供了许多类似库,例如WordPunctTokenizer,您可以按以下方式使用它:

from nltk.tokenize import WordPunctTokenizer
text = "Good muffins cost $3.88\nin New York.  Please buy me\ntwo of them.\n\nThanks."
print(WordPunctTokenizer().tokenize(text))

这将输出:

    ['Good', 'muffins', 'cost', '$', '3', '.', '88', 'in', 'New', 'York',
'.', 'Please', 'buy', 'me', 'two', 'of', 'them', '.', 'Thanks', '.']

您会注意到,它可以标记非常复杂的句子。