[pyar] Trabado con una re

Matías Bellone matiasbellone en gmail.com
Lun Ago 15 11:57:38 ART 2011


2011/8/15 Jose Jachuf <jjachuf en gmail.com>:
> El día 15 de agosto de 2011 11:30, Matías Bellone
> <matiasbellone en gmail.com> escribió:
>> 2011/8/15 Jose Jachuf <jjachuf en gmail.com>:
>>> Hola a todos
>>>
>>> Lo siguiente lo probé usando Kodos [1].
>>>
>>> Dada una cadena de valores separados por coma, correspondiente al
>>> values de un insert en sql, encontrar los valores correspondiente a
>>> cada campo.
>>>
>>> Ejemplo:
>>> 'D' Alessandro', '501', '649', 8, '848', 'TA', 'SA', '808', '800',
>>> '801', '848', '849', 'O' Higgins, esto es una prueba'
>>
>> Hasta donde yo sé, eso no son valores "válidos" para un INSERT en SQL.
>>
>> En particular porque la comilla después de la O en "O' Higgins"
>> tendría que estar escapada.
>
> Esta es una cadena real, y ya viene escapada:
>
> 'O''HIGGINS GRAL.
> BERNARDO','8871','8899','8870','8898','ST','S','17459','8870','8871','8898','8899','0105000'

Raro que use una comilla para escapar la comilla. Pero creo que se puede usar.

Tenés que modificar tu expresión regular para que sólo matchee la
comilla al final de la cadena sólo si el siguiente caracter no es otra
comilla. Dado que todas las cadenas están entre comillas, la expresión
regular más simple es:

 ('(?:[^']|'')+')

Eso es:
- una comilla
- seguida por una o más de alguna de las siguientes
   - cualquier cosa que no sea una comilla
   - dos comillas seguidas
- una comilla

>>> a = "'O''HIGGINS GRAL. BERNARDO','8871','8899','8870','8898','ST','S','17459','8870','8871','8898','8899','0105000'"
>>> d = re.compile("('(?:[^']|'')+')")
>>> c = d.findall(a)
>>> c
["'O''HIGGINS GRAL. BERNARDO'", "'8871'", "'8899'", "'8870'",
"'8898'", "'ST'", "'S'", "'17459'", "'8870'", "'8871'", "'8898'",
"'8899'", "'0105000'"]

Si no querés las comillas en las cadenas resultantes, también se puede
hacer corriendo un poco los paréntesis:

>>> d = re.compile("'((?:[^']|'')+)'")
>>> c = d.findall(a)
>>> c
["O''HIGGINS GRAL. BERNARDO", '8871', '8899', '8870', '8898', 'ST',
'S', '17459', '8870', '8871', '8898', '8899', '0105000']

Saludos,
Toote
-- 
Web: http://www.enespanol.com.ar



More information about the pyar mailing list