我有一个键和值的字典(为了易于阅读而被截断了):
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)...
答案 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
如果您要进行大量搜索,则可以考虑在循环之前预编译正则表达式。