【问题标题】:How to select elements of the list substring of the field value in Jinja?如何在 Jinja 中选择字段值的列表子字符串的元素?
【发布时间】:2021-12-17 20:41:18
【问题描述】:

有一个 jinja selectattr 表达式:

{{ foo|selectattr("name", "equalto", "bar42")|list }}

现在我想根据名称中包含“42”的事实进行过滤。 Python 版本是[x for x in foo if '42' in x['name']] 我应该使用什么样的运算符? in 不适合,因为它反向执行,测试 name 是否按照我提供的顺序。

我需要做相反的事情:检查我的子字符串是否在名称中。

【问题讨论】:

    标签: python ansible jinja2


    【解决方案1】:

    问:根据名称中包含 '42' 的事实进行过滤。

    答:除了Jinja tests,您还可以使用Ansible tests,即在这种特殊情况下使用Testing strings,例如给定列表

        foo:
          - name: foo42
          - name: bar42
          - name: baz99
    

    在名称中搜索正则表达式“42”

        - debug:
            msg: "{{ foo|selectattr('name', 'search', '42')|list }}"
    

    给予

      msg:
      - name: foo42
      - name: bar42
    

    为了您的方便。请参阅下面的测试文件。
    ---
    - hosts: localhost
      vars:
        foo:
          - name: foo42
          - name: bar42
          - name: baz99
      tasks:
        - debug:
            msg: "{{ foo|selectattr('name', 'equalto', 'bar42')|list }}"
        - debug:
            msg: "{{ foo|selectattr('name', 'match', 'bar42')|list }}"
        - debug:
            msg: "{{ foo|selectattr('name', 'match', '42')|list }}"
        - debug:
            msg: "{{ foo|selectattr('name', 'search', '42')|list }}"
        - debug:
            msg: "{{ foo|selectattr('name', 'regex', '42')|list }}"
    

    【讨论】:

    • 非常感谢您重复我自己的回答。
    • 伟大的思想都一样:)。当我开始时,您的答案还没有出现。我在你之后 10 分钟发布了答案。为了添加新值,我发布了测试文件。
    【解决方案2】:

    我发现了两个重要的细节:

    1. 它被称为“测试”,而不是“过滤器”,并且有一整页专门用于针对 jinja 的 ansible 特定测试:https://docs.ansible.com/ansible/latest/user_guide/playbooks_tests.html
    2. 有一组三个字符串测试:matchsearchregex

    “搜索”测试解决了我的问题:

    {{ foo|selectattr("name", "search", "42")|list }}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-02
      • 2023-03-28
      相关资源
      最近更新 更多