让我们检查一下regex_replace。它在我的“Ansible剧本”中起作用,但在ipython中却不行:
from jinja2 import Template
Template(" {{ zones | map('regex_replace', '(.*)', '\1') | join(',') }} ").render(zones=['z1','z2','z3'])投球:TemplateRuntimeError: No filter named 'regex_replace'.
第二次尝试:
from jinja2_ansible_filters.core_filters import regex_replace
env = jinja2.Environment()
env.filters["regex_replace"] = regex_replace
In [55]: env.from_string(" {{ zones | map('regex_replace', '(.*)', '\1') | join(',') }} ").render(zones=['z1','z2','z3'])
Out[55]: ' \x01\x01,\x01\x01,\x01\x01 '谢谢,
发布于 2022-10-23 13:59:24
您的问题不是,“如何在python中使用jinja2 ansible过滤器?”;您已经搞清楚了--您的第二个例子是做正确的事情。您的问题具体涉及到regex_replace模块,特别是在替换字符串中使用反向引用。
第一个问题只是基本的Python语法:当您用普通字符串编写\1时,这意味着“带有十六进制字符0x01的字节”。因此,regex_replace表达式用0x01...which替换了所有出现的(.*),从而解释了输出。好吧,部分地;您还需要锚定正则表达式(^(.*)$),否则它会匹配每行末尾的空字符串,从而导致两倍于您预期的替换。
但回到反向引用.正确的语法是什么?一个问题是,您的字符串将经历多个处理步骤;如果我们尝试明显的.
"{{ zones | map('regex_replace', '^(.*)$', '\\1') | join(',') }} "...we获得相同的输出。这意味着我们只需要逃避足够的时间来避免展开。事实证明,这是可行的:
"{{ zones | map('regex_replace', '^(.*)$', '\\\\1') | join(',') }} "我们可以通过使用原始字符串(r"...")来稍微简化一些事情:
r"{{ zones | map('regex_replace', '^(.*)$', '\\1') | join(',') }} "https://stackoverflow.com/questions/74171488
复制相似问题