[pyar] Ayuda con lxml y expresión regular

Fernando Copa copa.fernando en gmail.com
Mar Abr 12 00:57:51 ART 2016


Muchas gracias por las respuestas.
Tordek con tu ayuda entendí un poco mas de expresines regulares y averigûé
mas sobre negative lookahead y al parecer hay algunas librerías que no
soportan negative lookhead/behind según lo que estuve averiguando en
"regular-expression"[0] y en otras páginas.
Asi que buscando otras librerías me topé con "minixsv"[1] lo cual me ayudó
con mi objetivo (por ahora, lo tengo que seguir probando)

Ahora podré dormir más tranquilo y mañana continuar.

Muchas gracias por sus ayudas.

[0]: http://www.regular-expressions.info/xml.html
[1]: http://www.leuthe-net.de/MiniXsv.html

2016-04-11 20:19 GMT-03:00 Tordek <kedrot en gmail.com>:

>
> En este caso se divide así:
>
> -{0, 1}    # cero o un signo - (Que bien se podía escribir como '?')
> (?!  # negative lookahead
> \,?$ # coma (escapada, opcional) y fin de cadena
> )    # fin del NLA
> \d{0,12}    # cero dígitos hasta 12 dígitos
> (\,\d{0,2})?    # entiendo que es opcional pero \, no sé lo que quiere
> decir.
>
> la \ en las regex se usa para deshabilitar caracteres especiales. La regex
> "a?" matchea "a", "a?" y "b" (porque en todos casos hay 0 o 1 a); pero si
> lo que querés es solo el del medio, tenés que poner "a\?". Ponerselo a la ,
> no hace nada, porque , no es un caracter especial en regex (excepto adentro
> de {}).
>
>
> Cuando tenés (? es un grupo de captura con alguna característica especial,
> y el ! te dice cual es; en este caso, (?! es lo que se llama "negative
> lookahead": "si esta expresión matchea, la regex no matchea". Lo que hace
> la NLA acá es mirar si inmediatamente después del - (que puede no venir),
> si hay una coma (o no) y termina el string, no es una expresión válida...
> en otras palabras, se asegura de que haya algún dígito además del - y ,.
>
> Esto quiere decir que tu regex matchea una cadena que...
>
> puede tener un "-" inicial (o no).
> NO termina con una , inmediatamente.
> Tiene 0 a 12 números
> Opcionalmente, tiene una , y 0 a 2 números más.
>
> Es decir:
>
> 0
> -0
> -0,15
> -15,04
>
> pero no
>
> 12,111
> -, # esto es lo que el NLA está previniendo
> - #y esto también
> #y el string vacío
>
> Podés testearlo acá: https://regex101.com/ (detalle: tenés que poner ^ y
> $ alrededor de tu regex, y gm en las opciones, y podés poner un caso en
> cada línea para ver si matchea o no.
>
>
> 2016-04-11 16:29 GMT-03:00 Fernando Copa <copa.fernando en gmail.com>:
>
>> Hola Daniel gracias por tu respuesta.
>> En primer lugar, pido perdón por los nombre de archivos que quizás son
>> confusos.
>> En segundo lugar te explico cuál es mi objetivo.
>>
>> El objetivo en sí es dado un "archivo.xml" y el "Esquema" (No el dtd en
>> si) poder comprobar que "archivo.xml" respeta el esquema. Es decir, yo
>> tengo dos archivos:
>>
>> archivo.xml y esquema.xml (Me imagino que no tiene importancia la
>> extensión a .xsd)
>>
>> Y quiero validar archivo.xml con el esquema.xml
>> Entonces buscando documetación de la librería lxml de Python, leí que
>> existía tal función. Y los pasos a seguir eran lo que publiqué
>> anteriormente. Los nombres que puse en el test como archivoDTD.xml en
>> realidad contiene adentro un Esquema, y no un DTD (por eso te decía sobre
>> los nombres confusos de los archivos, quedaron así porque estaba haciendo
>> muchos test para poder encontrar el error y me olvidé cambiarlos a nombres
>> más significativos)
>>
>> El problema es que a mi me dan el Esquema.xml y alli dentro está la
>> expresión regular. Es decir, Esquema.xml contiene:
>> 1 <?xml version="1.0" encoding="utf-8"?>
>> 2 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
>> 3 <xs:element name="SSN">
>> ...
>> 167 <xs:simpleType name="Precio">
>> 168   <xs:restriction base="xs:string">
>> 169       <xs:pattern value="^-{0,1}(?!\,?$)\d{0,12}(\,\d{0,2})?$"/>
>> 170    </xs:restriction>
>> 171 </xs:simpleType>
>> ...
>>
>> Y bueno, con ese esquema traté de entenderlo haciendo pruebas en ipython
>> y es allí donde me larga el error descrito en el email anterior.
>> Pensando un poco, pensé que existe un archivo DTD y "alguíen" lo pasó
>> (con alguna herramienta) a un archivo xml shema, y esa "herramienta" generó
>> esa expresión regular. Entonces pensé en hacer la inversa, pasar a un dtd
>> (xml schema -> xml dtd) y usar una herramienta de python para volver a
>> pasarlo a un xml schema válido para python. Pero creo que es mucho lío. Y
>> aún mantengo la fe que tiene alguna solución. Ya que estuve probando con la
>> librería "re" de python y con ese mismo pattern y no tira para nada de
>> error, trabaja perfectamente. Aparentemente los valores para ese pattern
>> son números de hasta 12 digitos enteros con dos decimales.
>> $: También tengo entendido que es el final de una expr. regular, pero
>> "?$" (juntos) no estoy seguro que hace y más si sumamos el escape de la
>> coma "\,?$" tampoco se qué hace.
>> Si supiera que hace esa expresión regular, trataría de escribirlo de otra
>> manera sin perder la semántica.
>>
>> No sé que hacer, aún sigo buscando en la web más información.
>>
>> Gracias por sus tiempos.
>>
>> PD: El archivo DTD no me lo dan, me las tengo que arreglar con este
>> esquema.
>>
>> 2016-04-11 7:50 GMT-03:00 Daniel <dmlistapython en gmail.com>:
>>
>>> No soy precisamente un capo en expresiones regulares pero te paso lo que
>>> yo entiendo
>>>
>>>>
>>>>
>>>> Lo que entiendo de expresión regular es:
>>>> -{1,0}    # cero o un signo -      ->  uno (o menos) "-"  si fuera
>>>> -{1,3} (de uno hasta 3 "-")
>>>> (\?!\,?$)    # tengo duda lo que hace -> literalmente "?!?" el $ es
>>>> fín de cadena así que me parece que ese sería un problema
>>>> \d{0,12}    # cero dígitos hasta 12 dígitos
>>>> (\,\d{0,2})?    # entiendo que es opcional pero \, no sé lo que quiere
>>>> decir. -> la \ se utiliza para escapar, es decir si vos necesitas que te
>>>> reconozca el ? en una cadena debes poner \? (de hecho esto lo usas en el
>>>> segundo grupo)
>>>>
>>>
>>> ¿de dónde sacaste la expresión regular?
>>> tal vez seria bueno que pases algunos string y que aclares que necesitás
>>> caputurar.
>>>
>>>
>>>
>>> _______________________________________________
>>> pyar mailing list pyar en python.org.ar
>>> http://listas.python.org.ar/listinfo/pyar
>>>
>>> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>>>
>>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
>>> Argentina - http://www.usla.org.ar
>>>
>>
>>
>>
>> --
>> *Fernando Copa*
>>
>> /*
>>  ** San Salvador de Jujuy - Jujuy*
>>  */
>>
>> _______________________________________________
>> pyar mailing list pyar en python.org.ar
>> http://listas.python.org.ar/listinfo/pyar
>>
>> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>>
>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
>> Argentina - http://www.usla.org.ar
>>
>
>
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> Argentina - http://www.usla.org.ar
>



-- 
*Fernando Copa*

/*
 ** San Salvador de Jujuy - Jujuy*
 */
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20160412/153362c4/attachment.html>


Más información sobre la lista de distribución pyar