[pyar] Simple duda con expresiones regulares

Pablo Ziliani pablo en kultroom.com
Lun Mar 21 23:22:38 ART 2011


On 03/21/2011 08:33 PM, Jose Jachuf wrote:
> Tengo lo siguiente:
>
> import re
>
> sql = 'insert into tabla(id, campo1, campo2) values(12, valor1, valor2);'
> patron = r"[^/(]*\(*\)"
> print re.findall(patron,sql)
>
> obtengo esto:
> ['id, campo1, campo2)', '12, valor1, valor2)']
>
> lo que quiero es saber como quitar el paréntesis de cierre usando re y
> no a mano.


Podés usar los paréntesis para crear grupos que restrinjan aun más la 
capturas:

     findall(pattern, string, flags=0)
         Return a list of all non-overlapping matches in the string.

         If one or more groups are present in the pattern, return a
         list of groups; this will be a list of tuples if the pattern
         has more than one group.

         Empty matches are included in the result.


Te paso un ejemplo muy burdo (no captura correctamente comillas anidadas 
ni escapadas, valores conteniendo comas, etc.), que guarda los grupos en 
un diccionario y muestra el resultado con finditer o findall (o no).

import re

s = "insert into tabla(id, campo1, campo2) values(%i, valor1-%i, 
valor2-%i);"
sql = '\n'.join(s % (i, i, i) for i in range(20))

print "Datos:"
print sql

# insert into tabla(id, campo1, campo2) values(0, valor1-0, valor2-0);
# insert into tabla(id, campo1, campo2) values(1, valor1-1, valor2-1);
# etc.

regex = r"""^
insert\s+into\s+
     (?P<tabla>\w+)\(
         (?P<nombre1>[^,]+),\s*
         (?P<nombre2>[^,]+),\s*
         (?P<nombre3>[^)]+)
     \)\s*
     values\s*\(
         (?P<valor1>[^,]+),\s*
         (?P<valor2>[^,]+),\s*
         (?P<valor3>[^)]+)
     \)"""

print
print "Usando re.finditer:"

for match in re.finditer(regex, sql, re.VERBOSE|re.MULTILINE):
     print match.groupdict()

# {'valor1': '0', 'valor2': 'valor1-0', 'valor3': 'valor2-0', 'nombre2': 
'campo1', 'nombre3': 'campo2', 'nombre1': 'id', 'tabla': 'tabla'}
# {'valor1': '1', 'valor2': 'valor1-1', 'valor3': 'valor2-1', 'nombre2': 
'campo1', 'nombre3': 'campo2', 'nombre1': 'id', 'tabla': 'tabla'}
# etc...

print
print "Usando re.findall:"
print re.findall(regex, sql, re.VERBOSE|re.MULTILINE)

# [('tabla', 'id', 'campo1', 'campo2', '0', 'valor1-0', 'valor2-0'),
#  ('tabla', 'id', 'campo1', 'campo2', '1', 'valor1-1', 'valor2-1'),
#  ('tabla', 'id', 'campo1', 'campo2', '2', etc... )]




More information about the pyar mailing list