【问题标题】:Find whole part of list item, not subparts, in a string?在字符串中查找列表项的整个部分,而不是子部分?
【发布时间】:2019-07-07 00:51:51
【问题描述】:

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

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。

我不能在“否”键周围添加空格,因为它可能是提供的唯一响应。

如何使函数将“不”视为“不”而不是“知道”?我是否正确地认为这可能需要成为 RegExp 工作,还是我缺少更简单的东西?

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

【问题讨论】:

  • 那么,您希望键是“否”还是其中包含“否”? “不知道”好吗?
  • @Akaisteph7 不太理解你的问题。如果我将字符串“我不知道”传递给函数,则 responsePolarity 返回为 -0.95,因为它与“知道”中的“否”匹配。我不想要那个。我只希望它匹配“no”,如果“no”这个词是单独存在的,而不是像 know、snow、north、snore 等更大的词中的一对巧合字母。
  • 那么“不知道”可以吗?或者,如果您愿意,可以选择“不”。
  • @Akaisteph7 不...“不知道”不好。如果被检查的字符串是“不知道”,它应该为独立的“不”返回 -0.95。但是如果被检查的字符串是“知道是”,它应该返回一个 0.95 来表示是,并且永远不会将“知道”中的“否”视为要检查的有效项目。
  • 你所说的似乎是矛盾的。为什么不为您的问题中的几个案例添加一个预期输入和输出的示例。

标签: python string dictionary comparison string-comparison


【解决方案1】:

如果我理解正确,您希望匹配包含您的键的文本,但前提是整个单词都匹配。您可以使用正则表达式单词边界分隔符\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
“见鬼,也许是”匹配:是:0.95
'or hell yes' 匹配:是:0.95
'or hell yes' 匹配:hell yes : 0.99
'我想:是的,或者也许--地狱是的--' 匹配:是的:0.95
'我想:是的,或者也许——地狱是的——' 匹配:地狱是的:0.99

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

【讨论】:

  • 谢谢 - 我很确定 RegExp 将是我在这里的唯一选择。谢谢,感谢您的确认和您的努力:)
猜你喜欢
  • 1970-01-01
  • 2011-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-25
  • 2016-09-05
  • 2015-09-06
  • 1970-01-01
相关资源
最近更新 更多