[pyar] Ayuda con lxml y expresión regular

Tordek kedrot en gmail.com
Lun Abr 11 20:19:26 ART 2016


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
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20160411/05ed6a7a/attachment-0001.html>


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