使用正则表达式在列表中搜索字符串

Searching for a string in a list with a regular expression

我正在尝试通过以下任务安装 VirtualBox:

- name: Install VirtualBox RPM from "{{ virtualbox_url }}"
  dnf:
    name: "{{ virtualbox_url }}"
    state: present
  when: "'VirtualBox-6.0' not in ansible_facts.packages"
  tags: vagrant

这行得通,但我想更改我的 when: 子句以使用不带版本的“VirtualBox”。进行几次测试后,when: 子句中的字符串看起来需要完全匹配:

>>> list = ["Foo-6.0"]
>>> if "Foo" in list:
...    print("Yay")
...

>>> if "Foo-6.0" in list:
...    print("Yay")
...
Yay

Ansible 是否有办法将列表成员与正则表达式进行匹配?像下面这样的东西?:

import re
[f for f in ansible_facts.packages if re.search("VirtualBox",f)]

我通读了过滤器和测试文档,但似乎找不到执行此操作的方法。这似乎是一个常见问题,所以我一定是在搜索错误的东西(正在搜索 "ansible match string in list with regex")。如果有人有建议或 link 有这样做的秘诀,如果您能分享,我将不胜感激。

in 运算符可用于列表或字符串

第一种形式:

'string' in ['elem1', 'elem2']

如果列表中的一个元素恰好是 string

,则匹配

第二种形式:

'substring' in 'string'
如果 substring 包含在 string

中的某处,

将匹配

解决您的包列表问题的一种简单方法是在整个串联列表中搜索您的子字符串:

when: "'VirtualBox' not in ansible_facts.packages | join"

如果需要,此技术也可以与正则表达式一起使用...

when: ansible_facts.packages | join is match('.*VirtualBox.*')

... 或使用 search 测试

when: ansible_facts.packages | join is search('VirtualBox')