首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在python中测试jinja2 regex_replace不可用过滤器?

如何在python中测试jinja2 regex_replace不可用过滤器?
EN

Stack Overflow用户
提问于 2022-10-23 13:24:22
回答 1查看 46关注 0票数 0

让我们检查一下regex_replace。它在我的“Ansible剧本”中起作用,但在ipython中却不行:

代码语言:javascript
运行
复制
from jinja2 import Template
Template(" {{ zones | map('regex_replace', '(.*)', '\1') | join(',') }} ").render(zones=['z1','z2','z3'])

投球:TemplateRuntimeError: No filter named 'regex_replace'.

第二次尝试:

代码语言:javascript
运行
复制
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 '

谢谢,

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-23 13:59:24

您的问题不是,“如何在python中使用jinja2 ansible过滤器?”;您已经搞清楚了--您的第二个例子是做正确的事情。您的问题具体涉及到regex_replace模块,特别是在替换字符串中使用反向引用。

第一个问题只是基本的Python语法:当您用普通字符串编写\1时,这意味着“带有十六进制字符0x01的字节”。因此,regex_replace表达式用0x01...which替换了所有出现的(.*),从而解释了输出。好吧,部分地;您还需要锚定正则表达式(^(.*)$),否则它会匹配每行末尾的空字符串,从而导致两倍于您预期的替换。

但回到反向引用.正确的语法是什么?一个问题是,您的字符串将经历多个处理步骤;如果我们尝试明显的.

代码语言:javascript
运行
复制
"{{ zones | map('regex_replace', '^(.*)$', '\\1') | join(',') }} "

...we获得相同的输出。这意味着我们只需要逃避足够的时间来避免展开。事实证明,这是可行的:

代码语言:javascript
运行
复制
"{{ zones | map('regex_replace', '^(.*)$', '\\\\1') | join(',') }} "

我们可以通过使用原始字符串(r"...")来稍微简化一些事情:

代码语言:javascript
运行
复制
r"{{ zones | map('regex_replace', '^(.*)$', '\\1') | join(',') }} "
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74171488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档