首先:是的,我知道尝试仅使用正则表达式来完成此操作是愚蠢的,但是我需要在Carbon Rewrite Rules(实际上是Python正则表达式)的上下文中进行此操作,例如:
^collectd\.([a-z0-9]+)\. = \1.system.
我正在尝试将监视系统从基于Nagios的系统迁移到基于Collected的系统。但是,collected的write_graphite
插件经过硬编码以生成名为$prefix.host_example_com.$metric
的指标,而我们现有的指标则存储为$prefix.com.example.host.$metric
。
注意:主机名没有固定数量的节,它们可能是bar.foo
,baz.bar.foo
,bif.baz.bar.foo
等。
因此,基本上可以归结为在一次re.sub()
调用中完成此操作。
到目前为止,我已经得到:
metric = 'collectd.foo_bar_baz.some.metric'
pattern = r'^collectd\.(?:([^_.]+)_?)+(.*)$'
print re.sub(pattern, metric, r'\1 \2')
哪个输出为:baz .some.metric
,但我什至无法让它重复捕获组,让我们首先了解一下如何反向并加入任意数量的反向引用。
在单个re.sub()
调用中是否有可能实现这种目的,还是我应该让自己陷入命运如此糟糕的命名/组织指标以及充满通配符的查询中?