在字符串中找到列表项的整个部分,而不是子部分?

时间:2019-07-07 00:51:51

标签: python string dictionary comparison string-comparison

我有一个键和值的字典(为了易于阅读而被截断了):

responsePolarities = {'yes':0.95, 'hell yes':0.99, 'no':-0.95, 'hell no':-0.99, 'okay':0.70}

我正在检查传递给我的函数的字符串中是否有键:

for key, value in responsePolarities.items():
    if key in string:
        return value

问题是,如果在所传递的字符串中包含诸如“ know”之类的单词,该函数将在“ know”中看到“ no”并返回-0.95。

我无法在'no'键周围添加空格,因为它可能是唯一提供的响应。

如何使函数将“ no”视为“ no”而不是“ know”?我是否正确认为这可能需要进行RegExp作业,还是缺少一些更简单的东西?

我曾考虑过将传递的字符串拆分成单个单词,但是后来我无法检查会改变响应极性的多单词短语(例如no vs. hell no)...

1 个答案:

答案 0 :(得分:0)

如果我理解正确,那么您想匹配包含键的文本,但前提是整个单词都匹配。您可以使用正则表达式单词边界定界符\b进行此操作。当单词被标点符号分隔时,它将匹配,例如:no,,而不是其他单词字符,例如know。在这里,您遍历一些字符串,并为每个字符串在字典中找到匹配的键:

responsePolarities = {'yes':0.95, 'hell yes':0.99, 'no':-0.95, 'hell no':-0.99, 'okay':0.70}

strings = [
    'I know nothing',
    'I now think the answer is no',
    'hell, mayb yes',
    'or hell yes',
    'i thought:yes or maybe--hell yes--'
]

for s in strings:
    for k,v in responsePolarities.items():
        if re.search(rf"\b{k}\b", s):
            print(f"'{s}' matches: {k} : {v}")

'I know nothing'不应匹配任何内容。匹配项应如下所示:

  

“我现在认为答案是否定的”匹配:否:-0.95
  'hell,mayb yes'匹配:是:0.95
  'or hell yes'匹配:是:0.95
  'or hell yes'匹配:hell yes:0.99
  “我以为:是或-是---”匹配:是:0.95
  “我以为:是,或者-地狱是-”匹配项:地狱是:0.99

如果您要进行大量搜索,则可以考虑在循环之前预编译正则表达式。