用正则表达式组的dict替换Python字符串模板?

时间:2018-05-11 23:09:47

标签: python regex substitution

我是python / programing的新手,并试图在go中使用prometheus的statsd代理构建一个statsd到opentsdb代理。 我正在尝试使用如下字符串模板:

label_name = "${1}_${2}_${3}_${6}"

然后使用上面的label = string模板格式,将1,2,3和7的内容替换为不同字符串的re.match.groups。我以为我可以使用字符串Template.safe_substitute和一个小的for循环来将组转换为字典:

     ...:         label_match_dict = {}
     ...:         for i in range(len(input_match.groups())):
     ...:             label_match_dict[str(i+1)] = input_match.groups()[i]

然而我遇到了麻烦,因为它看起来像string.Template()正在寻找[_a-z][_a-zA-Z0-9],它与我的{1: "blue", 2: "green", 3: "red", 4: "yellow"}字典不匹配。现在我完全迷失了,并且觉得必须有一个干净的方式来做这个而不是我的花园小径。

所以说我有一个statsd指标,如:

connstats_by.vip.nested._Common_Domain.89.44.250.117.conncount:40|g

so之类的正则表达式字符串:

re.compile('connstats_by\\.vip\\.nested\\.([^.]*)\\.([^.]*)\\.([^.]*)\\.([^.]*)\\.([^.]*)\\.([^\:]*)(?:\:)([^\|]*)(?:\|)([^\n]*)')

在上面的for循环之后给了我:

{ 1: "_Primary_Domain",
  2: "192",
  3: "168",
  4: "1",
  5: "117",
  6: "conncount",
  7: "40",
  8: "g" }

我似乎无法将我的大脑包裹在用dict的成员替换模板的成员而没有真正看起来很嵌套的for循环。我觉得我走错了路。我希望这里的某个人能指出我在3个月后能够理解的更加诡计的方向。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

您的格式字符串需要位置列表,因此这应该有效:

label_name = "${1}_${2}_${3}_${6}"
metric = "connstats_by.vip.nested._Common_Domain.89.44.250.117.conncount:40|g"
rx = re.compile('connstats_by\\.vip\\.nested\\.([^.]*)\\.([^.]*)\\.([^.]*)\\.([^.]*)\\.([^.]*)\\.([^\:]*)(?:\:)([^\|]*)(?:\|)([^\n]*)')
print(label_name.format(*rx.match(metric).groups()))

打印

$89_$44_$250_$40