ayuda con python

Iniciado por AlejandroPrz, 8 Febrero 2014, 10:10 AM

0 Miembros y 1 Visitante están viendo este tema.

AlejandroPrz

Buenas amigos hacker's. ¿como les va? espero bien.

Tengo una pequeña duda, y es que como puedo hacer para leer todas las coincidencias en una linea con expresiones regulares, ya que estoy haciendo
un software en python para pasar las plantillas de smarty a puro php.
y entonces cuando lee una plantilla y busca una coincidencia, agarra solamente la primera, de la linea, y las otras se quedan sin editarse.

necesito mas o menos hacer esto:


de una linea supongamos esta
"<div>Usuario: {$usuario}<span> años: {$user.year}</span></div>"

necesito que las reemplace por estas

"<div>usuario <?php echo $usuario?><span><?php echo $user['year']; ?></span>

claro todo eso con expresiones regulares ya que pueden cambiar pero no consigo como hacerlo


este es mi codigo:

Código (python) [Seleccionar]
def parse(self, linea):
       txt = self._var(linea)
       txt = self._arrayVar(linea)
       return txt

   def _var(self, linea):
       txt = linea

       re1='.*?' # Non-greedy match on filler
       re2='(\\{' # Any Single Character 1
       re3='\\$' # Any Single Character 2
       re4='((?:[a-z][a-z0-9_]*))' # Variable Name 1
       re5='\\})' # Any Single Character 3

       rg = re.compile(re1+re2+re3+re4+re5,re.IGNORECASE|re.DOTALL)
       m = rg.search(txt)
       if m:
           print m.group(1) + ' -var simple'          
           var = m.group(2)
           txt = re.sub(r'' + re1+re2+re3+re4+re5, r'\1<?php echo \3;?>', txt)
           return txt
       else:
           return linea

   def _arrayVar(self, linea):
       txt = linea

       re1='.*?' # Non-greedy match on filler
       re2='(\\{' # Any Single Character 1
       re3='\\$' # Any Single Character 2
       re4='((?:[a-z][a-z0-9_]*))' # Variable Name 1
       re5='\\.' # Any Single Character 3
       re6='((?:[a-z][a-z0-9_]*))' # Variable Name 2
       re7='\\})' # Any Single Character 4

       rg = re.compile(re1+re2+re3+re4+re5+re6+re7,re.IGNORECASE|re.DOTALL)
       
       m = rg.search(txt)
       if m:
           print m.group(1) + ' -var double'
           var = m.group(2)
           array = m.group(3)
           txt = re.sub(r'' + re1+re2+re3+re4+re5+re6+re7, r'<?php echo ' + var + '[\'' + array + '\']; ?>' , txt)
           return txt
       else:
           return linea


necesito de sus ayudas. En verdad GRACIAS.

fary

No se Python, pero te lo dejo en Perl, que supongo que no cambiará mucho.

Sería con s// y añadiendo al final la letra g para que se repita tantas veces como aparezca la cadena.

en pseudocódigo:

s/CadenaARemplazar/CadenaRemplazada/g;


código real:

Código (perl) [Seleccionar]
use utf8;
use feature 'say';

open(my $file,"index.html");
undef $/;
my $datos = <$file>;
close $file;

$datos =~ s/<div>Usuario: {\$usuario}<span> años: {\$user.year}<\/span><\/div>/<div>usuario <?php echo \$usuario?><span><?php echo \$user['year']; ?><\/span>/g;

say $datos;
Un byte a la izquierda.

AlejandroPrz

gracias por comentar amigo, intentare a ver.