[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