Python re.sub pregunta

Saludos a todos,

No estoy seguro de si esto es posible, pero me gustaría usar grupos emparejados en una sustitución de expresiones regulares para llamar a las variables.

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 

pensamientos?

Puede especificar una callback cuando use re.sub, que tiene acceso a los grupos: 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) 

También nota el extra? En la expresión regular. Quieres un emparejamiento no codicioso aquí.

Entiendo que esto es solo un código de muestra para ilustrar un concepto, pero para el ejemplo que dio, el formato de cadena simple es mejor.

Suena como una exageración. ¿Por qué no hacer algo así?

 text = "find a replacement for me %(a)s and %(b)s"%dict(a='foo', b='bar') 

?

 >>> 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:]]'