如何用Python及Ansible的regex_replace过滤器实现字符串转换?
解决方法
你之前用的正则表达式完全匹配不到目标内容,^(?P<name>)$是匹配空行的规则,自然不会产生任何替换效果。下面提供几种可行的处理方案:
方案一:Jinja2模板内处理
如果是在Jinja2环境中操作,先把字符串按换行分割,再遍历每行做针对性拼接:
{% set input_str = '@cat\n@chicken\napple\nfruit\njuice' %} {% set lines = input_str.split('\n') %} {% for line in lines %} {% if loop.last %} {{ line }} : all {% else %} + : {{ line }} : all {% endif %} {% endfor %}
执行后会生成你需要的结果:前四行带+ : 前缀,最后一行直接输出juice : all。如果所有行都需要统一加+ : ,去掉if loop.last的判断即可。
方案二:Python原生代码处理
如果直接用Python脚本实现,代码逻辑更直观:
input_str = '@cat\n@chicken\napple\nfruit\njuice' lines = input_str.split('\n') result = [] for idx, line in enumerate(lines): if idx == len(lines) - 1: result.append(f"{line} : all") else: result.append(f"+ : {line} : all") final_output = '\n'.join(result) print(final_output)
运行后输出:
+ : @cat : all + : @chicken : all + : apple : all + : fruit : all juice : all
正则修正方案(仅作参考)
如果一定要用正则替换,需要匹配每行的实际内容而非空行,Jinja2中可这样写:
{{ '@cat\n@chicken\napple\nfruit\njuice'| regex_replace('^(.*)$', '+ : \\1 : all', multiline=True) }}
但这种方式会给所有行加上+ : 前缀,若要单独处理最后一行,正则逻辑会变得复杂,不如遍历方式简洁。
内容的提问来源于stack exchange,提问作者medisamm
相关产品推荐
相关产品推荐

