假设我们有一个很长的 ansible 字符串变量 mystr
.我们有一个正则表达式模式说 substr_pattern
并且匹配此模式的子字符串将从 mystr
中过滤掉并分配给另一个变量substr
.在 playbook_filters 上的文档中似乎没有明显的方法可以在 ansible 中执行此操作。尽管使用 re
很容易做到这一点python本身的模块。
ansible docs中给出了3种方法,但似乎都没有解决我的问题:
match
:此过滤器根据整个模式是否匹配整个字符串返回真/假,但不返回匹配的组/子字符串。 search
: 用于过滤更大字符串中的 substr。但是像 match
, 仅返回 true/false,而不是此处需要的匹配组/子字符串。 regex_replace
:这用于将字符串中的匹配模式替换为另一个字符串。但不清楚如何将匹配模式对应的子字符串/组注册到新变量中。 有什么我想念的吗?或者这是ansible中缺少的功能?
Ansible 版本: 2.1
例子:
mystr: "This is the long string. With a url. http://example.org/12345"
pattern: "http:\/\/example.org\/(\d+)"
substr: 12345 # First matched group i.e. \\1
摘要:如何获取匹配
pattern
的子串来自 mystr
并将其注册到 ansible 变量 substr
?
最佳答案
如果您可以修改模式,您可以使用 regex_replace
过滤并仅用匹配的数字替换整个字符串。
mystr | regex_replace('^.*http:\/\/example.org\/(\d+).*?$', '\\1')
要将结果分配给新变量,可以使用
set_fact
模块。- set_fact:
substr: "{{ mystr | regex_replace('^.*http:\/\/example.org\/(\d+).*?$', '\\1') }}"
关于ansible - 从 ansible 变量中过滤匹配模式的子字符串并将匹配的子字符串分配给另一个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37668442/