Вопрос Python re.sub
Приветствуем всех,
Я не уверен, что это возможно, но я хотел бы использовать сопоставленные группы в подстановке регулярных выражений для вызова переменных.
a = 'foo'
b = 'bar'
text = 'find a replacement for me [[:a:]] and [[:b:]]'
desired_output = 'find a replacement for me foo and bar'
re.sub('\[\[:(.+):\]\]',group(1),text) #is not valid
re.sub('\[\[:(.+):\]\]','\1',text) #replaces the value with 'a' or 'b', not var value
мысли?
Ответы
Ответ 1
Вы можете указать обратный вызов при использовании re.sub, который имеет доступ к группам:
http://docs.python.org/library/re.html#text-munging
a = 'foo'
b = 'bar'
text = 'find a replacement for me [[:a:]] and [[:b:]]'
desired_output = 'find a replacement for me foo and bar'
def repl(m):
contents = m.group(1)
if contents == 'a':
return a
if contents == 'b':
return b
print re.sub('\[\[:(.+?):\]\]', repl, text)
Также обратите внимание на дополнительные? в регулярном выражении. Вы хотите, чтобы не жадные сочетания здесь.
Я понимаю, что это всего лишь образец кода, чтобы проиллюстрировать концепцию, но для примера, который вы дали, простое форматирование строк лучше.
Ответ 2
Звучит как перебор. Почему бы просто не сделать что-то вроде
text = "find a replacement for me %(a)s and %(b)s"%dict(a='foo', b='bar')
?
Ответ 3
>>> d={}
>>> d['a'] = 'foo'
>>> d['b'] = 'bar'
>>> text = 'find a replacement for me [[:a:]] and [[:b:]]'
>>> t=text.split(":]]")
>>> for n,item in enumerate(t):
... if "[[:" in item:
... t[n]=item[: item.rindex("[[:") +3 ] + d[ item.split("[[:")[-1]]
...
>>> print ':]]'.join( t )
'find a replacement for me [[:foo:]] and [[:bar:]]'