Подстановка шаблона строки Python с помощью группы регулярных выражений? - PullRequest
0 голосов
/ 12 мая 2018

Я новичок в Python / программировании в целом и пытаюсь построить statsd для прокси opentsdb на основе prostheus statsd proxy в go. Я пытаюсь создать шаблон строки, подобный следующему:

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

Затем, используя вышеуказанный формат label = string template, замените содержимое 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

и строка регулярного выражения, такая как , поэтому :

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 без действительно грубого вида вложенного цикла. Я чувствую, что иду по неверному пути. Я надеюсь, что кто-то здесь может указать мне на более питоническое направление, которое я смогу понять через 3 месяца.

Заранее спасибо за любую помощь.

1 Ответ

0 голосов
/ 12 мая 2018

Ваша строка формата хочет позиционный список, поэтому это должно работать:

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
...