Python 纯用正则表达式拆分和反转字符串

Python 纯用正则表达式拆分和反转字符串,python,graphite,graphite-carbon,Python,Graphite,Graphite Carbon,首先:是的,我知道纯粹用正则表达式来实现这一点是愚蠢的,但我需要在基本上是Python正则表达式的Carbon重写规则的上下文中这样做,例如: ^collectd\.([a-z0-9]+)\. = \1.system. 我正在尝试将我们的监控系统从基于Nagios的系统迁移到基于Collectd的系统。但是,collectd的write\u graphite插件是硬编码的,用于生成名为$prefix.host\u example\u com.$metric的指标,我们现有的指标存储为$pref

首先:是的,我知道纯粹用正则表达式来实现这一点是愚蠢的,但我需要在基本上是Python正则表达式的Carbon重写规则的上下文中这样做,例如:

^collectd\.([a-z0-9]+)\. = \1.system.
我正在尝试将我们的监控系统从基于Nagios的系统迁移到基于Collectd的系统。但是,collectd的
write\u graphite
插件是硬编码的,用于生成名为
$prefix.host\u example\u 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()
调用中,这样的事情可能发生吗?还是我应该听天由命地接受命名/组织得很糟糕的度量和充满通配符的查询?

我没有尽可能多地使用
re
模块,但是使用常规语言“反转”字符串的想法听起来是行不通的(正则表达式所基于的语言理论概念)。这将需要一个堆栈,在该堆栈上推送列表中要反转的每个元素,然后根据该列表的pop顺序生成一个字符串。这将超出标准常规语言所能处理的范围,除非我缺少某些内容。可能可以使用PCRE递归regexp。我将其收回。尽管这是可能的用于匹配递归模式,我不知道如何在替换部分中使用它将它们重新组合在一起。多个重写规则可以应用于单个字符串吗?应该可以在一端匹配单个节并将其移动到另一端-制作足够多的该规则副本,以使节数尽可能多。是的我想这是一个漫长的过程。我想我必须写一些难看的配置,还可能提交一个collectd插件的补丁。谢谢大家!