Anda di halaman 1dari 16

ITSUR

Expresiones Regulares
Leguajes de autmatas
Antonio Alcntar Soria

2013

Expresin regular

Una expresin regular, a menudo llamada tambin patrn, es una expresin que describe un conjunto de cadenas sin enumerar sus elementos. La mayora de las formalizaciones proporcionan los siguientes constructores: una expresin regular es una forma de representar a los lenguajes regulares (finitos o infinitos) y se construye utilizando caracteres del alfabeto sobre el cual se define el lenguaje. Especficamente, las expresiones regulares se construyen utilizando los operadores unin, concatenacin y clausura de Kleene. Adems cada expresin regular tiene un autmata finito asociado.

El signo ms indica que el carcter al que sigue debe aparecer al menos una vez. Por ejemplo, "ho+la" describe el conjunto infinito hola, hoola, hooola, hoooola, etctera.

El signo de interrogacin indica que el carcter al que sigue puede aparecer como mucho una vez. Por ejemplo, "ob?scuro" casa con oscuro y obscuro.

El asterisco indica que el carcter que lo precede puede aparecer cero, una, o ms veces. Por ejemplo, "0*42" casa con 42, 042, 0042, 00042, etctera.

El Punto "."

El punto es interpretado por el motor de bsqueda como cualquier carcter. Excepto los caracteres que representan un salto de lnea, a menos que se le especifique esto al motor de Expresiones Regulares. Por lo tanto si esta opcin se deshabilita en el motor de bsqueda que se utilice, el punto le dir al motor que encuentre cualquier carcter incluyendo los saltos de lnea. En la herramienta EditPad Pro esto se hace por medio de la opcin "punto corresponde a nueva lnea" en las opciones de bsqueda. En .Net Framework se utiliza la opcin RegexOptions. Singleline al efectuar la bsqueda o crear la expresin regular. El punto se utiliza de la siguiente forma: Si se le dice al motor de RegEx que busque "g.t" en la cadena "el gato de piedra en la gtica puerta de getisboro goot" el motor de bsqueda encontrar "gat", "gt" y por ltimo "get". Ntese que el motor de bsqueda no encuentra "goot"; esto es porque el punto representa un solo carcter y nicamente uno. Si es necesario que el motor encuentra tambin la expresin "goot", ser necesario utilizar repeticiones, las cuales se explican ms adelante.

Aunque el punto es muy til para encontrar caracteres que no conocemos, es necesario recordar que corresponde a cualquier carcter y que muchas veces esto no es lo que se requiere. Es muy diferente buscar cualquier carcter que buscar cualquier carcter alfanumrico o cualquier dgito o cualquier no-dgito o cualquier no-alfanumrico. Se debe tomar esto en cuenta antes de utilizar el punto y obtener resultados no deseados.

La barra inversa o contra barra "\"

Se utiliza para "marcar" el siguiente carcter de la expresin de bsqueda de forma que este adquiera un significado especial o deje de tenerlo. O sea, la barra inversa no se utiliza nunca por s sola, sino en combinacin con otros caracteres. Al utilizarlo por ejemplo en combinacin con el punto "\." este deja de tener su significado normal y se comporta como un carcter literal.

De la misma forma, cuando se coloca la barra inversa seguida de cualquiera de los caracteres especiales que discutiremos a continuacin, estos dejan de tener su significado especial y se convierten en caracteres de bsqueda literal.

Como ya se mencion con anterioridad, la barra inversa tambin puede darle significado especial a caracteres que no lo tienen. A continuacin hay una lista de algunas de estas combinaciones: \t Representa un tabulador. \r Representa el "retorno de carro" o "regreso al inicio" o sea el lugar en que la lnea vuelve a iniciar. \n Representa la "nueva lnea" el carcter por medio del cual una lnea da inicio. Es necesario recordar que en Windows es necesaria una combinacin de \r\n para comenzar una nueva lnea, mientras que en Unix solamente se usa \n y en Mac_OS clsico se usa solamente \r. \a Representa una "campana" o "beep" que se produce al imprimir este carcter. \e Representa la tecla "Esc" o "Escape" \f Representa un salto de pgina \v Representa un tabulador vertical \x Se utiliza para representar caracteres ASCII o ANSI si conoce su cdigo. De esta forma, si se busca el smbolo de derechos de autor y la fuente en la que se busca utiliza el conjunto de caracteres Latin-1 es

posible encontrarlo utilizando "\xA9". \u Se utiliza para representar caracteres Unicode si se conoce su cdigo. "\u00A2" representa el smbolo de centavos. No todos los motores de Expresiones Regulares soportan Unicode. El .Net

Framework lo hace, pero el EditPad Pro no, por ejemplo. \d Representa un dgito del 0 al 9. \w Representa cualquier carcter alfanumrico \s Representa un espacio en blanco. \D Representa cualquier carcter que no sea un dgito del 0 al 9. \W Representa cualquier carcter no alfanumrico. \S Representa cualquier carcter que no sea un espacio en blanco. \A Representa el inicio de la cadena. No un carcter sino una posicin. \Z Representa el final de la cadena. No un carcter sino una posicin. \b Marca el inicio y el final de una palabra. \B Marca la posicin entre dos caracteres alfanumricos o dos noalfanumricos.

Notas: Utilidades como Charmap.exe de Windows o gucharmap de GNOME permiten encontrar los cdigos ASCII/ANSI/UNICODE para utilizarlos en Expresiones Regulares. Algunos lenguajes, como Java, asignan su propio significado a la barra invertida, por lo que deber repetirse para que sea considerada una expresin regular (ej. String expresion="\\d.\\d" para indicar el patrn \d.\d).

Los corchetes "[ ]"

La funcin de los corchetes en el lenguaje de las expresiones regulares es representar "clases de caracteres", o sea, agrupar caracteres en grupos o clases. Son tiles cuando es necesario buscar uno de un grupo de caracteres. Dentro de los corchetes es posible utilizar el guion "-" para especificar rangos de caracteres. Adicionalmente, los metacaracteres pierden su significado y se convierten en literales cuando se encuentran dentro de los corchetes. Por ejemplo, como vimos en la entrega anterior "\d" nos es til para buscar cualquier carcter que represente un dgito. Sin embargo esta denominacin no incluye el punto "." que divide la parte decimal de un nmero. Para buscar cualquier carcter que representa un dgito o un punto podemos utilizar la expresin regular "[\d.]". Como se hizo notar anteriormente, dentro de los corchetes, el punto representa un carcter literal y no un metacarcter, por lo que no es necesario antecederlo con la barra inversa. El nico carcter que es necesario anteceder con la barra inversa dentro de los corchetes es la propia barra inversa. La expresin regular "[\dA-Fa-f]" nos permite encontrar dgitos hexadecimales. Los corchetes nos permiten tambin encontrar palabras an si estn escritas de forma errnea, por ejemplo, la expresin regular "expresi[o]n" permite encontrar en un texto la palabra "expresin" aunque se haya escrito con o sin tilde. Es necesario aclarar que sin importar cuantos caracteres se introduzcan dentro del grupo por medio de los corchetes, el grupo slo le dice al motor de bsqueda que encuentre un solo carcter a la vez, es decir, que "expresi[o]n" no encontrar "expresioon" o "expresion".

La barra "|"

Sirve para indicar una de varias opciones. Por ejemplo, la expresin regular "a|e" encontrar cualquier "a" o "e" dentro del texto. La expresin regular "este|oeste|norte|sur" permitir encontrar cualquiera de los nombres de los puntos cardinales. La barra se utiliza comnmente en conjunto con otros caracteres especiales.

El signo de dlar "$"

Representa el final de la cadena de caracteres o el final de la lnea, si se utiliza el modo multi-lnea. No representa un carcter en especial sino una posicin. Si se utiliza la expresin regular "\.$" el motor encontrar todos los lugares donde un punto finalice la lnea, lo que es til para avanzar entre prrafos.

El acento circunflejo "^"

Este carcter tiene una doble funcionalidad, que difiere cuando se utiliza individualmente y cuando se utiliza en conjunto con otros caracteres especiales. En primer lugar su funcionalidad como carcter individual: el carcter "^" representa el inicio de la cadena (de la misma forma que el signo de dlar "$" representa el final de la cadena). Por tanto, si se utiliza la expresin regular "^[az]" el motor encontrar todos los prrafos que den inicio con una letra minscula. Cuando se utiliza en conjunto con los corchetes de la siguiente forma "[^\w ]" permite encontrar cualquier carcter que NO se encuentre dentro del grupo indicado. La expresin indicada permite encontrar, por ejemplo, cualquier carcter que no sea alfanumrico o un espacio, es decir, busca todos los smbolos de puntuacin y dems caracteres especiales.

La utilizacin en conjunto de los caracteres especiales "^" y "$" permite realizar validaciones en forma sencilla. Por ejemplo "^\d$" permite asegurar que la cadena a verificar representa un nico dgito, "^\d\d/\d\d/\d\d\d\d$" permite validar una fecha en formato corto, aunque no permite verificar si es una fecha vlida, ya que 99/99/9999 tambin sera vlido en este formato; la validacin completa de una fecha tambin es posible mediante expresiones regulares, como se ejemplifica ms adelante.

Los parntesis "()"

De forma similar que los corchetes, los parntesis sirven para agrupar caracteres, sin embargo existen varias diferencias fundamentales entre los grupos establecidos por medio de corchetes y los grupos establecidos por parntesis:

Los caracteres especiales conservan su significado dentro de los parntesis.

Los grupos establecidos con parntesis establecen una "etiqueta" o "punto de referencia" para el motor de bsqueda que puede ser utilizada posteriormente como se denota ms adelante.

Utilizados en conjunto con la barra "|" permite hacer bsquedas opcionales. Por ejemplo la expresin regular "al (este|oeste|norte|sur) de" permite buscar textos que den indicaciones por medio de puntos cardinales, mientras que la expresin regular "este|oeste|norte|sur" encontrara "este" en la palabra "esteban", no pudiendo cumplir con este propsito.

Utilizados en conjunto con otros caracteres especiales que se detallan posteriormente, ofrece funcionalidad adicional.

El signo de interrogacin "?"

El signo de pregunta tiene varias funciones dentro del lenguaje de las expresiones regulares. La primera de ellas es especificar que una parte de la bsqueda es opcional. Por ejemplo, la expresin regular "ob?scuridad" permite encontrar tanto "oscuridad" como "obscuridad". En conjunto con los parntesis redondos permite especificar que un conjunto mayor de caracteres es opcional; por ejemplo "Nov(\.|iembre|ember)?" permite encontrar tanto "Nov" como "Nov.", "Noviembre" y "November". Como se mencion anteriormente, los parntesis nos permiten establecer un "punto de referencia" para el motor de bsqueda. Sin embargo, algunas veces, no se desea utilizarlos con este propsito, como en el ejemplo anterior "Nov(\.|iembre|ember)?". En este caso el establecimiento de este punto de referencia (que se detalla ms adelante) representa una inversin intil de recursos por parte del motor de bsqueda. Para evitar se puede utilizar el signo de pregunta de la siguiente forma: "Nov(?:\.|iembre|ember)?". Aunque el resultado obtenido ser el mismo, el motor de bsqueda no realizar una inversin intil de recursos en este grupo, sino que lo ignorar. Cuando no sea necesario reutilizar el grupo, es aconsejable utilizar este formato. De forma similar, es posible utilizar el signo de pregunta con otro significado: Los parntesis definen grupos "annimos", sin embargo el signo de pregunta en conjunto con los parntesis triangulares "<>" permite "nombrar" estos grupos de la siguiente forma: "^(?<Da>\d\d)/(?<Mes>\d\d)/(?<Ao>\d\d\d\d)$"; Con lo cual se le especifica al motor de bsqueda que los primeros dos dgitos encontrados llevarn la etiqueta "Da", los segundos la etiqueta "Mes" y los ltimos cuatro dgitos llevarn la etiqueta "Ao".

NOTA: a pesar de la complejidad y flexibilidad dada por los caracteres especiales estudiados hasta ahora, en su mayora nos permiten encontrar solamente un carcter a la vez, o un grupo de caracteres a la vez. Los metacaracteres enumerados en adelante permiten establecer repeticiones

Las llaves "{}"

Comnmente las llaves son caracteres literales cuando se utilizan por separado en una expresin regular. Para que adquieran su funcin de metacaracteres es necesario que encierren uno o varios nmeros separados por coma y que estn colocados a la derecha de otra expresin regular de la siguiente forma: "\d{2}" Esta expresin le dice al motor de bsqueda que encuentre dos dgitos contiguos. Utilizando esta frmula podramos convertir el ejemplo "^\d\d/\d\d/\d\d\d\d$" que serva para validar un formato de fecha en "^\d{2}/\d{2}/\d{4}$" para una mayor claridad en la lectura de la expresin.

Nota: aunque esta forma de encontrar elementos repetidos es muy til, algunas veces no se conoce con claridad cuantas veces se repite lo que se busca o su grado de repeticin es variable. En estos casos los siguientes metacaracteres son tiles.

El asterisco "*"

El asterisco sirve para encontrar algo que se encuentra repetido 0 o ms veces. Por ejemplo, utilizando la expresin "[a-zA-Z]\d*" ser posible encontrar tanto "H" como "H1", "H01", "H100" y "H1000", es decir, una letra seguida de un nmero indefinido de dgitos. Es necesario tener cuidado con el comportamiento del asterisco, ya que ste, por defecto, trata de encontrar la mayor cantidad posible de caracteres que correspondan con el patrn que se busca. De esta forma si se utiliza "\(.*\)" para encontrar cualquier cadena que se encuentre entre parntesis y se lo aplica sobre el texto "Ver (Fig. 1) y (Fig. 2)" se esperara que el motor de bsqueda encuentre los textos "(Fig. 1)" y "(Fig. 2)", sin embargo, debido a esta caracterstica, en su lugar encontrar el texto "(Fig. 1) y (Fig. 2)". Esto sucede porque el asterisco le dice al motor de bsqueda que llene todos los espacios posibles entre los dos parntesis. Para obtener el resultado deseado se debe utilizar el asterisco en conjunto

con el signo de pregunta de la siguiente forma: "\(.*?\)" Esto es equivalente a decirle al motor de bsqueda que "Encuentre un parntesis de apertura y luego encuentre cualquier secuencia de caracteres hasta que encuentre un parntesis de cierre".

El signo de suma "+"

Se utiliza para encontrar una cadena que se encuentre repetida 1 o ms veces. A diferencia del asterisco, la expresin "[a-zA-Z]\d+" encontrar "H1" pero no encontrar "H". Tambin es posible utilizar este metacarcter en conjunto con el signo de pregunta para limitar hasta donde se efecta la repeticin.

Lenguajes regulares sobre un alfabeto

Un lenguaje regular sobre un alfabeto

dado se define recursivamente como:

El lenguaje vaco

es un lenguaje regular

El lenguaje cadena vaca {} es un lenguaje regular Para todo smbolo a {a} es un lenguaje regular Si A y B son lenguajes regulares entonces A B (unin), AB (concatenacin) y A* (clausura o estrella de Kleene) son lenguajes regulares. Si A es un lenguaje regular entonces (A) es el mismo lenguaje regular. No existen ms lenguajes regulares

Todo lenguaje formal finito constituye un lenguaje regular. Otros ejemplos tpicos son todas las cadenas sobre el alfabeto {a, b} que contienen un nmero par de aes o el lenguaje que consiste en varias aes seguidas de varias bes.

Si un lenguaje no es regular requiere una mquina con al menos una complejidad de (log log n) (donde n es el tamao de la entrada). En la prctica la mayora de los problemas no regulares son resueltos con una complejidad logartmica. Un lenguaje formal infinito puede ser regular o no regular. El lenguaje L = {an, n > 0} es regular porque puede ser representado, por ejemplo, mediante la expresin regular a+. El lenguaje L= {an bn, n > 0} es un lenguaje no regular dado que no es reconocido por ninguna de las formas de representacin anteriormente enumeradas.

Propiedades de cierre

Los lenguajes regulares son cerrados con las siguientes operaciones, de modo que si L y P son lenguajes regulares los siguientes lenguajes tambin sern regulares:

El complemento

de L

La clausura o estrella de Kleene L* de L El homomorfismo (L) de L La concatenacin L'P de L y P La unin L P de L y P La interseccin L P de L y P

La diferencia L \ P de L y P El reverso LR de L

Decidir cundo un lenguaje es regular

Para situar los lenguajes regulares en la jerarqua de Chomsky hay que notar que todo lenguaje regular es tambin un lenguaje libre de contexto, aunque la afirmacin contraria no es cierta, por ejemplo: el lenguaje que contiene el mismo nmero de aes y de bes es libre de contexto pero no regular. Para Hay dos aproximaciones puramente algebraicas para definir lenguajes regulares. Si es un alfabeto finito y * es un monoide libre consistente en todas las cadenas sobre , f: * M es un monoide simtrico donde M es un monoide finito y S es un subconjunto de M entonces el conjunto f-1(S) es regular. Todo lenguaje regular se presenta de esta manera. Si L es un subconjunto de *, se define la relacin equivalente ~ en * de la siguiente manera: u ~ v significa uw L si y solo si vw L para todo w * El lenguaje L es regular si y solo si el nmero de clases de equivalencia de ~ es finito; si este es el caso, este nmero es igual al nmero de estados del autmata determinista mnimo que reconocer L.

La gramtica es el estudio de las reglas y principios que regulan el uso de las lenguas y la organizacin de las palabras dentro de una oracin. Tambin se denomina as al conjunto de reglas y principios que gobiernan el uso de un lenguaje muy determinado; as, cada lengua tiene su propia gramtica.

La gramtica es parte del estudio general del lenguaje denominado lingstica. Clsicamente el estudio de la lengua se divide en cuatro niveles: Nivel: fontico-fonolgico. Nivel: sintctico- morfolgico.

Nivel: lxico- semntico. Nivel: pragmtico.

A veces se restringe el uso del trmino gramtica a las reglas y principios que definen el segundo de estos niveles. Sin embargo, la separacin de los niveles no es totalmente ntida porque ciertas reglas gramaticales se realizan en el nivel fontico-fonolgico e igualmente existen parmetros o criterios semnticos que sirven para decidir cundo una determinada construccin es gramatical.

Etimologa

El trmino gramtica deriva del griego [] (grammatik tkhne) donde tkhne significaba arte o tcnica y grammatik, derivado de (grmma, letra), significaba de las letras. 1 Para los griegos, este arte de las letras abarcaba todos los aspectos del discurso: ortografa, sintaxis, interpretacin de los textos e incluso la crtica literaria; es decir, englobaba buena parte de lo que hoy diferenciamos como filologa, como gramtica y como retrica.1

Fue Dionisio el Tracio, en su Tkhne Grammatik (siglo I a. C.), el que estableci una terminologa que heredaran las gramticas occidentales posteriores, a partir de las latinas.1 Los romanos, con Elio Donato a la cabeza, crearon el trmino litteratura (de littera, letra) que reservaron para la parte histrica e interpretativa, mientras que conservaron el helenismo grammatica para el conjunto de normas y reglas.

Tipos de gramtica

Entre los principales tipos de gramtica o enfoques en el estudio de la

gramtica se encuentran: La gramtica prescriptiva, o gramtica normativa es la que presenta normas de uso para un lenguaje especfico, tendiendo a desaconsejar las construcciones no estandarizadas. La gramtica tradicional es tpicamente prescriptiva. Este tipo de gramtica est basada usualmente en el dialecto de prestigio de una comunidad hablante, y desaconseja a menudo ciertas construcciones que son comunes entre los grupos socioeconmicos bajos y que comienzan a usarse en grupos sociales ms altos en funcin de emular el comportamiento de aquellos. Aunque la gramtica prescriptiva an suele utilizarse en pedagoga y en la enseanza de lenguas extranjeras, ha perdido peso en la lingstica acadmica moderna, y actualmente describe solamente un subconjunto del uso de la lengua.

La gramtica descriptiva intenta describir el uso actual de una lengua, evitando juzgar en forma prescriptiva. Se vincula a una determinada comunidad hablante y pretende proveer reglas de uso para cualquier palabra considerada gramaticalmente correcta en esa comunidad.

La gramtica tradicional es la coleccin de ideas acerca de la gramtica que las sociedades occidentales han heredado de Grecia y Roma. La gramtica prescriptiva es formulada usualmente en trminos de los conceptos descriptivos heredados de la gramtica tradicional. La gramtica descriptiva moderna apunta a corregir los errores de la gramtica tradicional, y generaliza su normativa restrictiva para evitar circunscribir los lenguajes al modelo del latn.

La gramtica funcional, es una visin general sobre la organizacin del lenguaje natural, formulada por Simon Dik, que contempla tres normas bsicas de adecuacin: la tipolgica, que implica la aplicacin de reglas a cualquier lengua, la pragmtica, que promueve la aplicacin de los enunciados a la interaccin en la comunicacin, y la psicolgica, por la que

trata de ser compatible con los mecanismos psicolgicos involucrados en el procesamiento de un lenguaje natural

La gramtica generativa es un enfoque formal para el estudio sintctico de las lenguas que puede en algunos sentidos generar las expresiones bien construidas de una lengua natural. Una rama de la teora lingstica (psicolingstica) se basa en la gramtica generativa, promovida por Noam Chomsky.

Las gramticas formales aparecen en lingstica computacional. La sintaxis de cada lenguaje de programacin se define de hecho por una gramtica formal. En teora de la informtica y en matemtica, la gramtica formal define lenguajes formales. La Jerarqua de Chomsky describe varias clases importantes de gramtica formal

Anda mungkin juga menyukai