Python 用正则表达式组的字典替换字符串模板?
Python string template substitution with dict of regex groups?
一般来说,我是 python/programing 的新手,正在尝试基于 prometheus 的 statsd 代理构建一个 statsd 到 opentsdb 代理。
我正在尝试使用如下所示的字符串模板:
label_name = "___"
然后使用上面的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 个月后理解的更 pythonic 方向。
在此先感谢您的帮助。
您的格式字符串需要一个位置列表,所以这应该有效:
label_name = "___"
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()))
打印
__0_
一般来说,我是 python/programing 的新手,正在尝试基于 prometheus 的 statsd 代理构建一个 statsd 到 opentsdb 代理。 我正在尝试使用如下所示的字符串模板:
label_name = "___"
然后使用上面的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 个月后理解的更 pythonic 方向。
在此先感谢您的帮助。
您的格式字符串需要一个位置列表,所以这应该有效:
label_name = "___"
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()))
打印
__0_