假设我们有一个长的ansible字符串变量mystr
。我们有一个正则表达式模式substr_pattern
,匹配此模式的子字符串将从mystr
过滤掉并分配给另一个变量substr
。似乎没有明显的方法可以通过playbook_filters上的文档在ansible中执行此操作,尽管在python本身中使用re
模块执行此操作很简单。
ansible docs中有3种方法,但似乎没有一种方法可以解决我的问题:
match
:此过滤器返回true / false,具体取决于整个模式是否与整个字符串匹配,但不返回匹配的组/子字符串。
search
:用于过滤较大字符串中的substr。但是像match
一样,只返回true / false并且不匹配此处所需的group / substring。
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
?
答案 0 :(得分:13)
如果您可以修改模式,则可以使用regex_replace
过滤器并将整个字符串替换为匹配的数字。
mystr | regex_replace('^.*http:\/\/example.org\/(\d+).*?$', '\\1')
要将结果分配给新变量,您可以使用set_fact
模块。
- set_fact:
substr: "{{ mystr | regex_replace('^.*http:\/\/example.org\/(\d+).*?$', '\\1') }}"