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

标签 python regex substitution

我对 python/编程不太熟悉,并尝试基于 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" }

我似乎无法全神贯注地用字典的成员替换模板的成员,而不需要一个看起来很恶心的嵌套 for 循环。我觉得我走错了路。我希望这里有人能给我指出一个更加Pythonic的方向,让我在3个月后能够理解。

预先感谢您的帮助。

最佳答案

您的格式字符串需要一个位置列表,因此这应该可行:

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

关于Python字符串模板替换为正则表达式组的字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50301358/

相关文章:

python - Pandas:有效地更改多列中的多个值

Vim 替换

python - EWS TimeZoneDefinitions : For a timezone, 如何计算当前时间的 UTC 偏移量

python - 在 Python 中将 CSV 索引到 ElasticSearch

r - 如何用 R 在字符串中的最后一个斜杠后用 "_"替换空格

regex - 匹配开始和结束字符,而无需从其他搜索中获取它们

python - 如何将新对象添加到嵌套字典中?

python - Django2.1.7项目urls.py无法正常工作(给出404错误)

javascript - 用 javascript 替换子字符串

regex - 这个替换有什么问题?