如何使用值正则表达式过滤字典



我需要根据正则表达式匹配其值来过滤字典。

mydict:
some_value: /my/path
another_value: 2345
anotherpath: /my/other/path

我尝试的是:

set_fact:
newvar: "{{ mydict | dict2items | selectattr('value', 'match', '^/my/.+$') | list }}"

但我得到的是:

expected string or buffer

如何根据字符串的一部分过滤所有值,以便稍后在with_items中使用它们?

您目前遇到的问题是正则表达式match无法处理整数。这将解决您的问题,尽管它稍微冗长一些:

- set_fact:
file_list: []
- set_fact:
file_list: "{{ file_list + [item.value] }}"
when: item.value|string | match('^/my/.+$')
loop: "{{ mydict | dict2items }}"

如果可以确保所有值始终为字符串,则可以使用:

- set_fact:
newvar: "{{ mydict | dict2items | selectattr('value', 'match', '^/my/.+$') | map(attribute='value') | list }}"

感谢 @matt-p 的澄清:-(我不知道这实际上是由匹配函数本身引起的。这更像是我应该向 Ansible 社区报告的问题吗?

顺便说一句,我稍微更改了您的代码以适应实际的 Ansible 标准(当条件使用已弃用的语法时(:

- set_fact:
file_list: []
- set_fact:
file_list: "{{ file_list + [item.value] }}"
when:
- item.value is string 
- item.value is match('^/my/.+$')
with_items: "{{ mydict | dict2items }}"

最新更新