expresiones regulares

Upload: esteban-diaz

Post on 08-Jul-2015

298 views

Category:

Documents


0 download

TRANSCRIPT

Scientia et Technica Ao XIII, No x, Mes de 200x. Universidad Tecnolgica de Pereira. ISSN 0122-1701

1

COMPORTAMIENTO DE EXPRESIONES REGULARES, DESDE LA PERSPECTIVA DEL MDULO RE DE PYTHON Y LA LIBRERA REGULAR EXPRESION DE JAVA.Behavior of regular expressions from the perspective of python module re and the regular expression library of java

RESUMEN De manera crtica y en busca de la comprensin de las funcionalidades que ofrecen las llamadas regex, regexp o expresiones regulares, este articulo evala el comportamiento de las anteriores, conformando una visin y perspectiva nueva desde el comportamiento, capacidad y flexibilidad que ofrecen al momento de solucionar problemas lxicos, validacin de entradas, bsqueda de patrones regulares dentro de estructuras que as lo requieran... PALABRAS CLAVES: alfabeto, emparejar, expresin regular, patrn. ABSTRACT Critically and looking for an understanding of the functionality offered calls regex, regexp or regular expressions, this article evaluates the performance of the above, forming a vision and new perspective from the behavior, capabilities and flexibility offered when lexical troubleshooting, input validation, regular pattern matching within structures that require .... KEYWORDS: alphabet, match, regular expression, pattern. 1. INTRODUCCIN De los avances tecnolgicos, informticos y en s del campo computacional moderno, se puede evidenciar la tendencia cada da ms arraigada de la sistematizacin de los flujos de informacin, de los sistemas de control, de orden social, medios de comunicacin, entre otros campos que conforman la sociedad actual Para dichas labores, son necesarias algunas estructuras de control, que posibiliten el hallar una solucin congruente, eficiente y de bajos costos de una manera ideal y veloz. Una de estas herramientas presentes en el comn de humano, es la clasificacin, que en lo pertinente es referenciada por las expresiones regulares o regexp. Las regexp, brindan la posibilidad de hacer un anlisis detallado de los patrones, que conforman los requerimientos de un conjunto, para lo cual se busca evidenciar que tipo de lenguaje (para el caso Java o Python) pudiese brindar mejor desempeo de acuerdo con las caractersticas y necesidades del sistema. 2. OBJETIVOS 4. Describir el concepto de regexp. Brindar un acercamiento a los componentes y usos bsicos de una regexp.

Crear analogas, entre el comportamiento de las regexp en el lenguaje Python y el lenguaje Java.

3. DEFINICIN DE UNA REGEXP Las expresiones regulares, consisten en patrones que describen conjuntos de cadenas de caracteres; en un mbito formal, toda expresin regular sobre (alfabeto) denota un lenguaje regular sobre . Entonces se puede decir que un lenguaje regular (finito o infinito) est descrito por un conjunto de expresiones regulares, para lo cual cabe notar que hay expresiones regulares equivalentes, por lo tanto pueden denotar a un mismo lenguaje. De la lgica computacional formal tenemos la definicin de una expresin regular (regexp), de manera recursiva, usando la notacin convenida: 1. 2. 3. y son expresiones regulares a es una expresin regular para todo a . Si r y s son expresiones regulare, entonces r s, r s y r* tambin lo son. Ninguna otra secuencia de smbolos es una expresin regular.

De ah que una expresin regular se construya generalmente por medio de los operadores de

Fecha de Recepcin: (Letra Times New Roman de 8 puntos) Fecha de Aceptacin: Dejar en blanco

2

Scientia et Technica Ao XIII, No x, Mes de 200x. Universidad Tecnolgica de Pereira.

concatenacin (.), unin () y cerradura de Kleene (*). Para ejemplificar una expresin regular, sera algo parecido a escribir en la consola de comandos de Windows (cmd) dir *.exe, sta describira cualquier cadena de caracteres seguida de .exe, es decir todos los archivos ejecutables (exe). 4. APORTES DE LAS REGEXP En el rea de la computacin, son cada vez ms importantes y apropiadas, gracias a su uso en la programacin las expresiones regulares son un mtodo por el cual puede realizar una bsqueda de un patrn definido en cadenas de caracteres, sin importar su longitud; con aplicaciones muy significativos en el campo de la redaccin y correccin lexicogrfica de documentos. Adems esta funcionalidad se extiende a sistemas como la validacin formatos, registro y control de acceso a reas de seguridad; los anteriores vistos en su mayor parte en el rea de los recursos electrnicos va internet.

Nombre Lnea Fin de Lnea

Caracter $ [...] [^...]

Descripcin Fin de Lnea Conjunto de caracteres admitidos Conjunto de caracteres no admitidos Especificar un rango dentro de un conjunto de carcter, escrito entre corchetes Agrupacin de varios elementos Indicar que un metacarcter se interprete como un smbolo del alfabeto Carcter salto de lnea Carcter de tabulacin

Operador de Rango

-

(...) Carcter de Escape Salto de Lnea Tabulador \ \n \t

Tabla 1. meta-caracteres en una regexp.

5. COMPONENTES BSICOS Desde el punto de vista de la programacin las regexp constan de ciertos grados de independencia, por lo cual se puede trabajar con ellas en lenguajes diversos, tales como: Java, grep, Perl, Tcl, Python, PHP, y awk. Lo cual no indica una diferencia marcada, si no ms bien que se rigen por un estndar. Las expresiones regulares estn formadas por un conjunto de caracteres del alfabeto que la conforma y un pequeo conjunto de caracteres extra (metacaracteres) , que definen las restricciones del lenguaje a representar, estos son: Nombre Cierre Caracter * Descripcin El elemento precedente puede aparecer 0 o ms veces El elemento precedente debe aparecer 1 o ms veces Un carcter cualquiera excepto salto de lnea Operador unario. El elemento precedente es opcional Operador binario. Operador OR entre dos elementos Inicio de Lnea Python, usa el conjunto de meta-caracteres descrito en la Tabla 1, sin embargo para casos en donde hay que referir la comprobacin de un carcter muy usado, se tienen las siguientes secuencias especiales: \d: un dgito. Equivale a [0-9] \D: cualquier carcter que no sea un dgito. Equivale a [^0-9] \w: cualquier caracter alfanumrico. Equivale a [a-zA-Z0-9_] \W: cualquier carcter no alfanumrico. Equivale a [^a-zA-Z0-9_] \s: cualquier carcter en blanco. Equivale a [ \t\n\r\f\v] \S: cualquier carcter que no sea un espacio en blanco. Equivale a [^ \t\n\r\f\v] 6. FUNCIONALIDAD Y ANALOGAS Un mtodo es til, cuando se conocen sus caractersticas y se usa una herramienta adecuada para implementarlo, para el caso se presentarn las funcionalidades del mdulo re y la librera regular expression para las regexp, de los lenguajes Python y Java respectivamente. 6.1. FUNCIONALIDAD MDULO RE PHYTON Este mdulo proporciona operaciones para la comparacin de expresiones regulares similares a las de Perl, compuesto por tipos de objetos tales como PatternObject, MatchObject y RegexObject.

Cierre Positivo Comodn Condicional

+ . ?

OR Comienzo de

| ^

Scientia et Technica Ao XIII, No x, Mes de 200x. Universidad Tecnolgica de Pereira.

3

Las anteriores secuencias, pueden estas descritas dentro de una clase de secuencias, as: [/s,.], para comprobar cualquier cadena que contenga un espacio, , .. En Python el uso de la barra invertida / para escapar caracteres especiales no es muy comn, suele usarse la notacin raw string, si un patrn de una expresin regular se precede de r, los siguientes caracteres no se tomaran por su valor especial; por ejemplo r \n la cadena contiene dos caracteres \ y n, mientras \n la cadena slo contiene el carcter salto de lnea. Cadena Regular (Regular String) "ab*" "\\\\section" "\\w+\\s+\\1" Cadena Prima (Raw string) r"ab*" r"\\section" r"\w+\s+\1"

Al momento de tener en cuenta excepciones sintcticas el mtodo complie, puede recibir argumentos extra flags, para dichas variaciones, as: >>> p = re.compile('ab*', re.IGNORECASE) Algunos de estos flags son: Flag Descripcin

re.I No hay diferenciacin entre re.IGNORECASE maysculas y minsculas re.L re.LOCALE re.M re.MULTILINE re.S re.DOTALL re.X re.VERBOSE Comprobar secuencias como \w, \W, \b, \B, \s y \S, dependiendo de la ubicacin actual Hace que el meta-caracter ^ represente el inicio de lnea y el meta-caracter & represente el fin de lnea Hace que al meta-carcter encaje en el final de lnea Ignora los espacios no escapados

Tabla 2. Notacin raw string para una regexp.

Antes de usar algn mtodo del mdulo re, este debe ser importado, usando la sentencia import re La expresin regular ms sencilla consiste en una cadena simple que describe un conjunto compuesto solo por ella misma: >>> if re.macth ("python", "python"): print "true" Para comprobar si cualquier cadena termina en ython, se usa la siguiente regexp: >>> re.macth (".ython","jython") En los casos en donde se presentan regdexp que deben comprobar ciertas cadenas, se pude hacer uso del operador OR |, de la siguiente forma: >>> re.macth ("str1"|"str2"|"str3","jython") De las ejemplificaciones anteriores, se puede deducir la estructura de la regexp para los dems conjuntos de metacaracteres y secuencias especiales, ya expuestos. Las regexp pueden ser compiladas como objetos de tipo pattern objects, stos pueden ser instanciados usando el mtodo compile del mdulo re, su comportamiento es expuesto a continuacin: >>> import re >>> p = re.compile('ab*') >>> print p

Tabla 3. Especificaciones de los flags en Pyton.

Para la combinacin de dos o mas flags se puede usar el operador OR |. El mdulo re consta de una serie de mtodos que lo hacen ser una herramienta muy verstil, stos se exponen a continuacin: macth() y search()se diferencian en que uno define si el inicio de una cadena concuerda con la regexp y el otro define si una parte de la cadena concuerda con la regexp, respectivamente. Ambos mtodos tienen por retorno un objeto SRE_Match, de haber tenido xito, de lo contrario None. split(), divide la cadena por ocurrencias del patrn, para lo cual retorna una lista con las subcadenas. findall() y finditer(), el primero devuelve una lista con las subcadenas que cumplieron el patrn, el segundo retorna un iterador con el cual se puede consultar cada ocurrencia. findall() cada vez que se halla un ocurrencia, sta se reemplaza por una cadena, pudindose indicar el nmero de ocurrencias a sustituir.

____________________________ 1. Las notas de pie de pgina debern estar en la pgina donde se citan. Letra Times New Roman de 8 puntos

4

Scientia et Technica Ao XIII, No x, Mes de 200x. Universidad Tecnolgica de Pereira.

6.2. FUNCIONALIDAD REGULAR EXPRESIN LIBRARY JAVA El paquete java.util.regex, ofrece un modelo de objetos gil y elegante para satisfacer todas las necesidades en cuanto a regexp se refiere; se compone bsicamente de tres tipos de objetos Pattern Object, Matcher Object y PatternSyntaxException Object. La declaracin de una regexp mas sencilla para Java, se basa una cadena a ser la expresin regular y un objeto Pattern que la compila y un objeto Matcher, que evale el patrn sobre alguna cadena, asi: java.uti.regex* String regex = "\\ba\\w*\\b"; Pattern p = Pattern.compile(regex); Matcher m = p.matcher(str); Las expresiones regulares en Java, tambin se rige por los meta-caracteres expresados en la Tabla1; as como tambin por las secuencias especiales definidas para el mdulo re de Python, estas ltimas denominadas Boundary Characters. La clase Pattern cuenta con mtodos (a manera de flags) para el manejo de excepciones como los mencionados para el caso de Python, anexando los siguientes: Flagpublic static final int CASE_INSENSITIVE

Mtodos para la particin o generacin de grupo a partir de una cadena evaluada con un determinado patrn, como public String[] split(CharSequence input), el cual retorna unalista con las subcadenas acogidas por la regexp. Regularmente esta capacidad esta asociada a los objetos de la clase String, puesto que estos y otros mtodos han sido exportados a formar parte del sumario de funcionalidades de la clase. La clase Matcher, cuenta con mtodos para evaluacin y conformacin de las subcadenas resultantes de la clasificacin de cierto patrn, uno de sus mtodos ms poderosos es group(),que extrae una parte de la

cadena que cumple con la regexp aplicada.

Descripcin comparacin de caracteres ASCII, sin importar el caso. Anlisis de los datos obtenidos a travs de una mquina UNIXFigura1. Ilustra los mtodos de la clase Matcher.

public static final int UNIX_LINES

Indica que el patrn public static compilado contiene un final int COMMENTS comentario, este es sealado con el carcter # Cambiar la representacin public static de un carcter por otra final int CANON_EQ equivalenteTabla 4. Especificaciones de los flags en Java.

Adems del manejo de excepciones, ste paquete consta con mtodos para obtener excepciones del patrn como lo es public int flags() . Igualmente mtodos como public static boolean matches(String regex,CharSequence input),

La anterior tabla, ilustra los mtodos ms relevantes de la clase Match; uno de ellos destacndose por su versatilidad en el rea del procesamiento de texto, ste es entonces el mtodo find(), su objetivo es recorrer la cadena buscando ocurrencias del patrn entregado, de encontrarse con exactitud se retorna true, si no, procede con partes de la cadena que coincidan y de alguna otra forma retorna false, a falta de coincidencias. En el mismo campo, est el mtodo replaceAll(), para reemplazar todas las apariciones de una cadena por otra.6.3. ANALOGAS Ahora, con base en las ejemplificaciones anteriores, de los mtodos para regexp ms comunes y sus usos relevantes; se tratar de brindar un conjunto de analogas,

que permiten comparar una regexp, con una secuencia de caracteres, sin que haya que definirse un PatternObject.

Scientia et Technica Ao XIII, No x, Mes de 200x. Universidad Tecnolgica de Pereira.

5 Codificacin y decodificacin de archivos, para lo cual en el primero se realiza el cumplimiento de un patrn primario para de l obtener los datos finales; y en el segundo se realiza el cumplimiento de ciertas ocurrencias en los datos para determinar cmo proceder y con otra serie de patrones, realizar una conversin de los datos. Tambin, conversin de tipos de formato de archivo (avi, mpeg, mp4, mkv, wmv, mp3, wma, wav, bmp, jpg, png. etc), Asi como la validacin de cdigos Zip. Validacin de entradas en formularios y archivos en la red.

que permitan evidenciar la relevancia de cada lenguaje segn el campo en el que se puedan dar las necesidades. Ambos lenguajes convergen en el tipo de uso y enfoque dado a los problemas referentes a las expresiones regulares. Las bases y fundamentos que originaron los grupos de primitivas para el manejo de las expresiones regulares tienen el mismo origen, el lenguaje de programacin Perl. Python al ser un lenguaje multi-paradigma, realiza un manejo de las regexp con un enfoque verstil. Es decir, la programacin de stas expresiones brinda la posibilidad de expresar un mismo patrn con una estructura interna diferente, ms sin embargo, esto no implica que los mtodos usados para hacerlo sean otros. Java, es un leguaje fuertemente tipado y netamente un lenguaje del paradigma orientado a objetos, los cual diferencia la funcionalidad de los mtodos de las regexp en contra posicin con la fluidez de Python. Es decir en los objetos se logra determinar un patrn, por medio de un mtodo que lo compila y lo convierte en un objeto de ese tipo, pero al momento de modificarlos, estas representaciones se realizan mediante la combinacin de algunos mtodos que permitan obtener el resultado adecuado. La observacin anterior, porque los lenguajes orientados a objetos, estn dados a la reutilizacin y optimizacin del cdigo, para lo cual hacen uso de mtodos concisos, para labores especficas. El manejo de las excepciones en los dos lenguajes es de estructura similar, sin embargo cabe mencionar que el listado de flags usados en Python, es mucho ms extenso y aplicable a casos generales y particulares; mientras el de Java es mucho ms especfico para los casos particulares, ya que el tipo de paradigma que usa lo restringe (no siempre) para implementar alguna ambigedades que s se pueden presentar en Python.

8. CONCLUSIONES Las expresiones regulares brindan una alta gama de aplicabilidad en el campo computacional, con grandes a portes al mundo social. La funcionalidad de las regexp en Python, proporciona las herramientas necesarias al programador para realizar su trabajo de forma compacta y multi-funcional. La funcionalidad de las regexp en Java, ofrecen versatilidad en el mbito de la portabilidad, ya que hasta el momento la operatividad de los aplicativos de ste lenguaje, es independiente de la plataforma. Independientemente de las particularidades o generalizacin de los problemas, ambos lenguajes implementan soluciones similares a dichos requerimientos.

9. BIBLIOGRAFA Isabel Navarrete Snchez, Teora de Autmatas y Lenguajes Formales, Universidad de Murcia Dean Kelly, Teora de Autmatas y Lenguajes Formales, ED. Prentice Hall - Ciencias Computacionales Python v2.7 documentation & Python v3.2 documentation, http://docs.python.org/library/re.html Mehran Habibi, Java Regular Expressions: Taming the java.util.regex Engine Web Regular Expression Library, http://regexlib.com/

7. APLICACIONES Algunas aplicaciones comunes son: Procesamiento lxico de textos, entre ellos como ejemplo revisin automtica de la ortografa textos y artculos.

____________________________ 1. Las notas de pie de pgina debern estar en la pgina donde se citan. Letra Times New Roman de 8 puntos

6

Scientia et Technica Ao XIII, No x, Mes de 200x. Universidad Tecnolgica de Pereira.

Sun microsystems Java Tutorials http://download.oracle.com/javase/tutorial/essential/regex /intro.html Ral Gonzlez Duque, Python Para Todos

Scientia et Technica Ao XIII, No x, Mes de 200x. Universidad Tecnolgica de Pereira.

7

____________________________ 1. Las notas de pie de pgina debern estar en la pgina donde se citan. Letra Times New Roman de 8 puntos

8

Scientia et Technica Ao XIII, No x, Mes de 200x. Universidad Tecnolgica de Pereira.