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

Find whole part of list item, not subparts, in a string?

我有一个键和值的字典(为便于阅读而大量截断):

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' 和 returns 中看到 'no' -0.95。

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

如何让函数将 'no' 视为 'no' 而不是 'know'?我是否正确地认为这可能需要一个 RegExp 工作,还是我遗漏了一些更简单的东西?

我想过将我传递的字符串拆分成单独的词,但后来我无法检查修改响应极性的多词短语(比如 no vs. hell no)...

如果我没有理解错的话,您想要匹配包含您的键的文本,但前提是整个单词都匹配。您可以使用正则表达式单词边界定界符 \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' 不应匹配任何内容。匹配项应如下所示:

'I now think the answer is no' matches: no : -0.95
'hell, mayb yes' matches: yes : 0.95
'or hell yes' matches: yes : 0.95
'or hell yes' matches: hell yes : 0.99
'i thought:yes or maybe--hell yes--' matches: yes : 0.95
'i thought:yes or maybe--hell yes--' matches: hell yes : 0.99

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