如何在Ansible中使用selectattr同时匹配多个字符串
合并Ansible中两个selectattr的筛选逻辑
你当前通过两次selectattr实现了筛选字典列表中name属性同时包含unique_string1和unique_string2的项,确实可以合并为一次筛选操作,下面提供两种可行方案:
方案一:使用正则正向预查
正则中的AND逻辑不能直接拼接AND,需要用正向预查来实现同时匹配多个字符串的需求。修改后的代码如下:
- set_fact: myvar: "{{ list.objects | selectattr('name', 'search', '(?=.*' ~ unique_string1 ~ ')(?=.*' ~ unique_string2 ~ ')') | map(attribute='name') | last }}" vars: unique_string1: "yes" unique_string2: "no"
正则说明
(?=.*{{unique_string1}}):正向预查,确保目标字符串中包含unique_string1,.*匹配任意长度的任意字符(?=.*{{unique_string2}}):同理,确保目标字符串中包含unique_string2- 该正则不限制两个字符串的出现顺序
方案二:使用select结合条件判断
如果不想用正则,也可以直接用select过滤器,通过自定义条件判断实现同时匹配,可读性更强:
- set_fact: myvar: "{{ list.objects | select( item => item.name is search(unique_string1) and item.name is search(unique_string2) ) | map(attribute='name') | last }}" vars: unique_string1: "yes" unique_string2: "no"
逻辑说明
select( item => ... ):遍历list.objects中的每个项,执行自定义判断逻辑item.name is search(unique_string1) and item.name is search(unique_string2):直接判断当前项的name同时包含两个目标字符串
两种方案都能实现和原代码相同的效果,可根据自身对正则的熟悉程度选择。
内容的提问来源于stack exchange,提问作者N. J
相关产品推荐
相关产品推荐

