首先:是的,我知道尝试纯粹使用正则表达式来完成此操作是愚蠢的,但我需要在本质上是 Python 正则表达式的 Carbon Rewrite Rules 的上下文中执行此操作,例如:
^collectd\.([a-z0-9]+)\. = \1.system.
我正在尝试将我们的监控系统从基于 Nagios 的系统迁移到基于 Collectd 的系统。但是,collectd 的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()
通话中发生,还是我应该让自己接受一个非常命名/组织化的指标和充满通配符的查询的命运?