【问题标题】:Ansible regular expression to remove an item from stringAnsible 正则表达式从字符串中删除项目
【发布时间】:2020-10-12 09:25:54
【问题描述】:

对于以下三个输出需要一个单一的正则表达式:

输入1:aa::bb::cc 输出1:aa::cc
输入2:bb::aa::cc 输出2:aa::cc
输入3:aa::cc::bb 输出3:aa::cc

我已经写了下面的正则表达式。但是多余的双冒号还在。

示例: {{ aa::bb::cc | regexx_replace('bb') }} --> 输出为:aa::::cc

【问题讨论】:

  • 为什么你绝对需要用正则表达式来做这个?这将很难编写,可能难以阅读,并且当您在几周/月内遇到它进行维护时,您将需要相当多的时间来了解您所做的事情。 IMO 有一个更简单的解决方案。尝试使用这一衬里,例如:ansible localhost -m debug -a msg="{{ 'aa::bb::cc'.split('::') | difference(['bb']) | join('::') }}"。另请注意,这可以与要删除的任意数量的元素一起使用。
  • 你的例子不起作用。 a)您不能将字符串推送到这样的过滤器中,因为它会尝试将aa::bb::cc 解析为变量。 b)它是regex_replace(你有regexx_replace)。

标签: python regex ansible


【解决方案1】:

这是你的正则表达式:(::b+|b+::)

它将匹配:: 后跟一个或多个bs 一个或多个bs 后跟::,所以无论如何它都会带上双冒号如果它们在bs 之前或之后。当它看到::bb::aa::bb::cc 一样时,只有其中一个会匹配,结果将是aa::cc(所以第二对冒号仍然存在)。

【讨论】:

  • 好的。所以现在让我们修改我们的输入字符串:bb::bbb::bbbb :) 我只是把它推得太远了,只是为了指出更多地保护正则表达式会使它几乎不可读。但如果你不需要,你的解决方案就是 KISS。
  • @toydarian 感谢您的回复。您对问题的逻辑确实有效。但根据 Zeitounator 的说法,如果存在多个输入值,这种逻辑会导致问题。例如,ansible localhost -m debug -a msg="{{ 'aa::bb::cc::bbb::bbbb' | regex_replace('::bb|bb::') }}" --> 给出输出作为“味精”:“aa::ccbbb”
  • @Mani 您的问题导致了这样的假设,即您想准确替换两个bs。所以我回答了你的问题。请参阅我的最新编辑以获取将匹配一个或多个 bs 的正则表达式(它们仍然需要在 :: 旁边),如果 bs 位于任何其他字符旁边,它将不起作用。像这样aabb::aa::cc 会变成aaaa::cc
  • @toydarian,太好了。这也有帮助。
猜你喜欢
  • 2021-01-17
  • 2014-06-20
  • 1970-01-01
  • 1970-01-01
  • 2022-06-28
  • 2021-09-07
  • 2017-08-24
  • 2012-03-21
  • 2018-11-20
相关资源
最近更新 更多