JMESPath多特征过滤异常:单条件正常多条件返回空结果求助
JMESPath contains函数列表过滤失效的原因及解决方法
问题根源
JMESPath的contains函数参数顺序和用法有明确规则:
- 第一个参数是容器(可以是字符串或数组),第二个参数是要查找的目标元素
- 单关键词生效的原因:
contains(word,cube)是检查字符串word中是否包含子串cube,完全符合函数逻辑,所以能正确匹配 - 列表过滤失效的原因:
contains([cube,-], word)是检查数组["cube","-"]里是否存在与word(即"ice-cube")完全相等的元素,显然不存在,因此返回空结果
正确的列表关键词过滤写法
要实现「word包含列表中任意一个关键词」的需求,需要结合any函数遍历关键词列表,逐个验证包含关系:
import jmespath data = {'collection': {'items': {'word': 'ice-cube'}}} # 正确的查询表达式 result = jmespath.search( 'values(collection)[?word!=null && [`cube`,`-`] | any(@, contains(word, @))]', data ) print(result) # 输出: [{'word': 'ice-cube'}]
表达式说明
[cube,-] | any(@, contains(word, @)):先构造关键词列表,再用any函数遍历列表中的每个元素@,检查word是否包含该元素;只要有一个关键词匹配,整个条件就为真
内容的提问来源于stack exchange,提问作者Blob
相关产品推荐
相关产品推荐

