regex, buscar cadenas con comillas

Oswaldo Hernández listas en soft-com.es
Lun Dic 10 19:21:55 CET 2007


Antonio Beamud Montero escribió:
> El lun, 10-12-2007 a las 16:31 +0100, Oswaldo Hernández escribió:
>> Chema Cortes escribió:
>>> El 7/12/07, Oswaldo Hernández <listas en soft-com.es> escribió:
>>>> Antonio Beamud Montero escribió:
> 
>>      def FiltraSQL(self, sql):
>>          # ajustes en sentencia sql antes de su proceso
>>
>>          # dividir sentencia en fragmentos para modificar los entrecomillados y volver a montar
>>          partes = re.split("('.*?')|(\".*?\")", sql)
>>          # eliminar Nones
>>          while None in partes:
>>              partes.remove(None)
>>
>>          for n,p in zip(range(len(partes)),partes):
>>              if p[0] == "'" or p[0] == '"':
>>                  partes[n] = p.replace("*", "%")
>>
>>          return "".join(partes)
>>
>> Imagino que se podrá optimizar bastante, pero de momento me ha valido.
> 
> Y que harás en un caso como almacenar l'enfant ? Es un ejemplo, o tu
> sentencia sql incluya un nombre así?
> 

En principio re.split maneja bien esto:
 >>> re.split("('.*?')|(\".*?\")", "select  ... where nombre like \"*l'enfant*\"")
['select  ... where nombre like ', None, '"*l\'enfant*"', '']

El problema vendria si la sentencia llegara: .. like 'l'enfant'
En este caso el sql daria error al ejecutarlo aunque que no filtrase, pero eso es problema de la 
aplicación que origina el sql. Esta aplicación simplemente recibe una sentencia, la ejecuta y 
devuelve el resultado a la aplicación original.

El problema del filtro ha surgido al cambiar el driver de conexión a la base de datos, el anterior 
admitia el caracter '*' como comodín para la clausula like mientras que el actual utiliza '%' y 
rechaza el antiguo. Nos es mas facil filtrar las sentencias aqui que modificar las diversas 
aplicaciones que utilizan este sistema.

-- 
*****************************************
Oswaldo Hernández
oswaldo (@) soft-com (.) es
*****************************************
------------ próxima parte ------------
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes


Más información sobre la lista de distribución Python-es