2010-01-19 9 views
14

Saludos a todos,Python pregunta re.sub

no estoy seguro si esto es posible, pero me gustaría utilizar grupos emparejados en un cambio de expresiones regulares para llamar 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 

thoughts?

+0

ha! realmente no. familiar con py, perl y php - master de none. gracias por su ayuda :) – netricate

Respuesta

24

Puede especificar una devolución de llamada cuando se utiliza 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) 

Observe también el extra? en la expresión regular. Quieres una coincidencia no codiciosa aquí.

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

+0

gracias por el código! esto está más cerca de lo que estaba pensando. – netricate

+2

Respondí tu pregunta, pero creo que estabas haciendo una pregunta incorrecta. Cuando corresponda, utilice el formato de cadena de preferencia a las expresiones regulares. Noufal Ibrahim respondió la pregunta que debería haber hecho. –

+0

No olvide las comillas en las declaraciones de devolución. :) –

8

Suena excesivo. ¿Por qué no simplemente hacer algo como

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

?

+0

el texto se almacena en la base de datos. Creo que podría reemplazar todos los valores [[::]] con valores%() y eso debería funcionar. Lo probaré. ¡Gracias! – netricate

+0

este método depende de si conoce la posición de [[: a:]] y [[: b:]]. – ghostdog74

+0

Hay muchos problemas, pero lo que el OP intenta hacer es conceptualmente lo mismo que el formateo de cadenas. –

2
>>> 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:]]' 
+0

gracias por otra mirada a esto. ¡muy genial! :) – netricate

Cuestiones relacionadas