aplicaciones de las er

15
|pro LENGUAJES Y AUTOMATAS I Alumnos: José Luis Morales Velázquez No. Control 117o1136 Donato Aquino Barrios No. Control 117o1076 APLICACIÓN DE LAS EXPRESIONES REGULARES (ER) Profesor: Edgar Gustavo Ortíz López INGENIERÍA EN SISTEMAS COMPUTACIONALES

Upload: donato-aquino

Post on 08-Apr-2016

214 views

Category:

Documents


2 download

DESCRIPTION

dsadsdsdsadsadsadasdasdasdasdsaddsdasd

TRANSCRIPT

|pro

LENGUAJES Y AUTOMATAS I

Alumnos:

José Luis Morales Velázquez No. Control 117o1136

Donato Aquino Barrios No. Control 117o1076

APLICACIÓN DE LAS EXPRESIONESREGULARES (ER)

Profesor: Edgar Gustavo Ortíz López

INGENIERÍA EN SISTEMASCOMPUTACIONALES

INTRODUCCIÓNLas expresiones regulares son un sistema cómodo, rápido y potente (una vez se domina) de realizar un filtrado sobre undeterminado caso, y obtener un grupo más reducido y específico, excluyendo los resultados que no coincidan conel patrón dado.

Siendo más técnicos, con ayuda de un modelo matemático, llamado DFA (Autómata Finito Determinista) se puede observarcómo se aceptarían las cadenas que casaran con la expresión regular equivalente abc*.

Partiendo del estado de arranque q0, podemos transitar al estado q1 con el símbolo a y transitar al estado q2 con elsímbolo b para llegar a un estado de aceptación (doble trazo) e incluso seguir transitando indefinidamente con el simbolo c,lo que demostraría que las cadena ab, abc, abcc... entrarían dentro de las cadenas que acepta.

Una ER o Expresión Regular es un equivalente algebraico para un autómata.

Utilizado en muchos lugares como un lenguaje para describir patrones en texto que son sencillos pero muy útiles.

Pueden definir exactamente los mismos lenguajes que los autómatas pueden describir: Lenguajes regulares.

Ofrecen algo que los autómatas no: Manera declarativa de expresar las cadenas que queremos aceptar.

Dado un alfabeto Dado un alfabeto Σ, una expresión regular sobre expresión regular sobre Σ se define de forma recursiva:

ER primitivas: Φ, λ, {a | a ЄЄЄ Σ Є}

Si α y β son ER, entonces son también ER: α + β (unión), α β (concatenación), α* (cierre), (α).

No existen otras reglas para la construcción de ER sobre Σ.

Fecha: 14/02/2015 Página 2

Lenguajes y Autómatas [SCB-1015]

DESARROLLOLa potencia de las expresiones regulares es increíblemente amplia. Suele ser especialmente útil para los programadores ymanejadores de bases de datos (PHP,Perl, Java, .NET...), que pueden desarrollar y reconocer patrones complejos de unaforma sencilla.

Las expresiones regulares tienen múltiples utilidades, no solo se utilizan en los lenguajes de programación sino también en elámbito de la lingüística de corpus y de la lingüística computacional.

Si no eres programador también puedes hacer uso de las expresiones regulares para multitud de tareas. Muchasaplicaciones utilizan expresiones regulares y seguro que no tenías ni una idea, por ejemplo:

Bloc de notas: Aunque no el base de Windows, sino notepad2. Especialmente útil para reemplazar cadenas en textos en losque están repetidos varias veces (ficheros HTML, de texto etc.).

Comandos UNIX: Comandos de administrador de sistemas como grep, egrep, awk, sed y tantos otros. Recuerda que siusas Windows, puedes utilizar muchos de estos comandos con UNIXUtils.

Renombrado masivo: Existen multitud de programas para renombrar ficheros utilizando expresiones regulares como RegExRenamer.

Emule: El mismísimo emule permite realizar busquedas con un grupo reducido de expresiones regulares, por ejemplo siqueremos buscar canciones que empiecen por Spectrum (para buscar de este grupo musical), podemosescribir ^Spectrum y especificar ficheros de audio, evitando asi canciones que tengan el nombre Spectrum en su título.Además en Preferencias / Opciones adicionales / Mostrar más controles (Controles de modo avanzado) puedes activarlas expresiones regulares para filtrar categorías en las pestañas de tráfico.

Renombrado de MP3: Con Quick File Rename, se mezcla la potencia de las expresiones regulares a la capacidad de utilizarlos tag ID3 para renombrar tus archivos.

Las expresiones regulares denotan lenguajes.

Por ejemplo, la expresión regular: 01* + 10* denota todas las cadenas que son o un 0 seguido de cualquier cantidad 1's o un 1 seguida de cualquier cantidad de 0's.

Fecha: 14/02/2015 Página 3

Lenguajes y Autómatas [SCB-1015]

Las operaciones que realizan los lenguajes son:

Unión o Alternativa: Consideremos dos lenguajes diferentes definidos sobre el mismo alfabeto L1 ⊂ W(∑) y L2 ⊂ W(∑). Se denomina unión de ambos lenguajes al lenguaje formado por las palabras de ambos lenguajes:

L1 U L2={ x | x ∈ L1 ó x ∈ L2}

Concatenación: Consideremos dos lenguajes definidos sobre el mismo alfabeto, L1 y L2. La concatenación o producto de estos lenguajes es el lenguaje L1 L2= { xy / x ∈ L1 y x ∈ L2} Las palabras de este lenguaje estarán formadas al concatenar cada una palabra del primero de los lenguajes con otra del segundo.

La concatenación de lenguajes con el lenguaje vació es ΦL = L Φ = Φ

Potencia de un lenguaje: Se define la potencia i-ésima de un lenguaje a la operación de concatenarlo consigo mismo i veces. Li= LLL ....L |------------| i

Clausura positiva de un lenguaje: Se define la clausura positiva de un lenguaje L: ∞ L + = U L i i=1

Lenguaje obtenido uniendo el lenguaje con todas sus potencias posibles excepto Lº. Si L no contiene la palabra vacía, la clausura positiva tampoco

Cierre o Clausura de un lenguaje: Se define el cierre o clausura de un lenguaje L como : ∞ L* = U Li i=0

Lenguaje obtenido uniendo el lenguaje con todas sus potencias posibles, incluso Lº. Todas las clausuras contienen la palabravacía.

Existen tres operaciones básicas que se pueden realizar sobre las ER:

Selección de alternativas : Se indica con el operador |(barra vertical). Si r y s son ER, entonces r | s es una ER que define a cualquier cadena que concuerde con una r o una s, también se dice que r | s , es la unión de los

Fecha: 14/02/2015 Página 4

Lenguajes y Autómatas [SCB-1015]

lenguajes de r y s y lo podemos definir: L( r | s ) = L( r ) U L( s ). Esta operación se puede extender a más de dos ER.

Concatenación: Se indica con la yuxtaposición de las ER. Si r y s son ER, entonces rs es una ER que define a cualquier cadena que concuerde con la concatenación de r y s , esta operación la podemos definir: L(rs) = L(r)L(s).Esta operación se puede extender a más de dos ER.

Repetición o Cerradura: También se conoce con el nombre de cerradura de Kleene. Se indica con el operador *.Si r es una ER, entonces r* es una ER que define a las cadenas de caracteres representadas por la concatenación repetida de r en n veces, o sea que lo podemos definir como: L(r*) = L(r)*o también lo podemos definir como la unión infinita de conjuntos r :r* n = r 0 r 1 r 2...r n.

Para los programadores o aquellas personas asociadas a mundo de la tecnología, en una operación normal de búsqueda y reemplazo es necesario proporcionar el texto exacto para que coincida con los resultados deseados. Aunque esta técnica puede ser adecuada para tareas de búsqueda y reemplazo sencillas de texto estático, carece de flexibilidad y hace cuando menos difícil, si no imposible, la búsqueda de texto dinámico.

Con las expresiones regulares, se puede:

Comprobar si existe un modelo dentro de una cadena.

Por ejemplo, puede probar una cadena de entrada para ver si un modelo de número de teléfono o de número de

tarjeta de crédito aparece dentro de la cadena. Esto se denomina validación de datos.

Reemplazar texto.

Puede utilizar una expresión regular para identificar el texto específico de un documento y quitarlo o reemplazarlo con

otro texto.

Extraer una subcadena de una cadena en función de la coincidencia del modelo.

Puede buscar texto específico dentro de un documento o campo de entrada.

Fecha: 14/02/2015 Página 5

Lenguajes y Autómatas [SCB-1015]

Por ejemplo, si necesita buscar en un sitio Web, quite el material obsoleto y reemplace alguna de las etiquetas de

formato HTML. En este caso, puede utilizar una expresión regular para determinar si el material de las etiquetas de

formato HTML aparece en cada archivo. Este proceso reduce la lista de archivos afectados a los archivos que

contengan el material de destino que se desea quitar o cambiar. A continuación, puede utilizar una expresión regular

para quitar el material obsoleto. Por último, puede utilizar una expresión regular para buscar y reemplazar las

etiquetas.

Una expresión regular también es útil en un lenguaje como JScript o C, que no se distinguen por su capacidad de

controlar cadenas.

En GNU, no se distinguen expresiones regulares básicas de extendidas; los comandos aceptan todas las expresiones

regulares. En ese caso, como siempre se están usando extendidas, los metacaracteres ?, +, {, |, (, y ) deben ser

escapados cuando se quieren usar como caracteres normales, escribiendo \?, \+, \{, \|, \(, y \).

CONCLUSIÓNComo han podido observar una expresión regular es una forma de representar a los lenguajes regulares (finitos o infinitos) yse construye utilizando caracteres del alfabeto sobre el cual se define el lenguaje. No solo los programadores utilizan lasExpresiones Regulares, también aquellas personas que no lo son hacen el uso de estas aunque no se estén dando cuenta,todo esto debido a que las ER son un sistema cómodo, rápido y potente de realizar un filtrado sobre un determinado caso, yobtener un grupo más reducido y específico, excluyendo los resultados que no coincidan con el patrón dado, lo cual nos evitalas múltiples operaciones y/o actividades que se tienen que realizar para llegar al resultado.

Específicamente, las expresiones regulares se construyen utilizando los operadores unión, concatenación y clausura deKleene.

Fecha: 14/02/2015 Página 6

Lenguajes y Autómatas [SCB-1015]

BIBLIOGRAFÍAFriedl, J.E.F. (2006). 3er. Ed. Mastering Regular Expressions. O´Reilly; USA.

Kernighan-Pike[1987], Coffin[1989]

https://msdn.microsoft.com/es-es/library/az24scfc%28v=vs.110%29.aspx

http://www.ccg.unam.mx/~contrera/bioinfoPerl/node18.html

https://support.google.com/analytics/answer/1034324?hl=es

http://es.wikipedia.org/wiki/Expresi%C3%B3n_regular

EJEMPLOS DE APLICACIÓNEjemplo 1: Búsqueda de imágenes en la PC.

Si tenemos varias carpetas, con miles y miles de imagenes con distintos nombres y formatos (JPG, PNG, GIF...) y nos interesa separar todas las fotografías en las que aparece Ramón (ramon_borracho.jpg, ramon45.jpg, ramon_de_viaje.bmp, etc.).

La primera opción que se nos ocurre es hacerlo de forma manual, cosa que nos consumiría demasiado tiempo si se trata de más de, por ejemplo, 5.000 fotografías.

La siguiente opción es utilizar los comodines (wildcards): Utilizando los comodines * (cualquier conjunto de carácteres) y ? (cualquier carácter, sólo uno), podemos obtener más precisión de una forma sencilla: ramon*.jpg, ramon*.???, *ramon*.*, ...). En estos casos, la potencia de los comodines suele ser suficiente.

Sin embargo, el método anterior es limitado, puesto que, si quisieramos detectar fotografías con nombres como ramón.jpg, r4m0n.jpg, raaamoncito.jpeg pero no incluir román.jpg, romén.jpg y sólo incluir imagenes con formato jpg no habría forma de discriminar entre ambas opciones, salvo utilizando una expresión regular: ^.*ra|4m(o|0|ó)n.*\.jpg$.

Ejemplo 2: Para describir el léxico de un lenguaje de programación

Por ejemplo para el lenguaje C++:

Palabras Claves = main + if + else + while + do + switch + case +...

Dígitos = 1+2+3+4+5+6+7+8+9

Número Entero Sin Signo = 0+Dígitos.(Dígitos+0)*

Letra = a + b + c + d+... + z

Fecha: 14/02/2015 Página 7

Lenguajes y Autómatas [SCB-1015]

Identificador = (Letra+ _) . (Letra+ _ + Dígitos+0)*

Ejemplo 3: Expresiones Regulares en el lenguaje Inglés.

Forma incorrecta: * I think that to buy weapons…

Forma correcta: I think that buying weapons…

La expresión regular utilizada para detectar el error es: \sthink\sthat\sto\s

Este es un error frecuente cometido por hispanohablantes. El verbo think seguido de una oración subordinada suele ir acompañado por un vervo en gerundio y no por un verbo en infinitivo como to. Es un ejemplo que sólo encuentra una secuencia, es decir, en esta ocación la expresión regular descrita anteriormente detectará únicamente únicamente una secuencia en la que aparecerán las palabras indicadas. Sin embargo, se trata de un ejemplo muy útil por tratarse de una confusión muy ferecuente, y su inclusión en el corrector gramatical resulta muy pertinente.

Coincidencia solo con la palabra completa

Ejemplo de

uso

Coincidencia con la palabra inútil; no coincide con útil, útilmente, utilidad, etc.

Ejemplo de

regex

(\W|^)inútil(\W|$)

Notas \W coincide con cualquier carácter que no sea una letra, un número o un guión bajo. Impide que la

expresión regex coincida con letras que precedan o que sigan a la palabra.

Importante: al crear una expresión regex para que coincida con palabras completas, debes incluir la clase

de carácter \W para evitar que se filtren mensajes legítimos.

^ coincide con el inicio de una nueva línea. Permite a la expresión regex coincidir con la palabra si

aparece al principio de la línea, sin ningún carácter que le preceda.

$ coincide con el final de una línea. Permite a la expresión regex coincidir con la palabra si aparece al

final de la línea, sin ningún carácter que le siga.

Fecha: 14/02/2015 Página 8

Lenguajes y Autómatas [SCB-1015]

Coincidencia solo con la frase exacta

Ejemplo

de uso

Coincidencia con la frase consejos mercados.

Ejemplos

de regex

Ejemplo 1: (\W|^)consejos\mercados(\W|$)

Ejemplo 2:(\W|^)consejos\s{0,3}mercados(\W|$)

Ejemplo 3: (\W|^)consejos\s{0,3}mercado(s){0,1}(\W|$)

Notas \W coincide con cualquier carácter que no sea una letra, un número o un guión bajo. Impide que la

expresión regex coincida con caracteres que precedan o que sigan a la frase.

En el ejemplo 2, \s coincide con un carácter de espacio y {0,3} indica que pueden aparecer de cero a tres

espacios entre las palabras consejos y mercado.

^ coincide con el inicio de una nueva línea. Permite a la expresión regex coincidir con la frase si aparece al

principio de la línea, sin ningún carácter que le preceda.

$ coincide con el final de una línea. Permite a la expresión regex coincidir con la frase si aparece al final de

la línea, sin ningún carácter que le siga.

En el ejemplo 3, (s) coincide con la letra s, y {0,1} indica que la letra puede aparecer una vez

oninguna después del término "mercado". Por lo tanto, la expresión regex coincide con consejos de

mercado y con consejos de mercados. Si lo prefieres, puedes utilizar el carácter ? en lugar de {0,1}.

Fecha: 14/02/2015 Página 9

Lenguajes y Autómatas [SCB-1015]

Coincidencia con la palabra o con la frase de una lista

Ejemplo de

uso

Coincidencia con cualquier palabra o frase de la lista siguiente:

tontería

maldito

caray

caramba

madre mía

ostras

Ejemplos

de regex

(\W|^)(tontería|maldito|caray|caramba|madre\smía|ostras)(\W|$)

Notas (...) agrupa todas las palabras de modo que la clase de carácter \W afecta a todas las palabras del

paréntesis.

\W coincide con cualquier carácter que no sea una letra, un número o un guión bajón. Impide que la

expresión regex coincida con caracteres que precedan o sigan a las palabras o a las frases de la lista.

^ coincide con el inicio de una nueva línea. Permite a la expresión regex coincidir con la palabra si

aparece al principio de la línea, sin ningún carácter que le preceda.

$ coincide con el final de una línea. Permite a la expresión regex coincidir con la palabra si aparece al

Fecha: 14/02/2015 Página 10

Lenguajes y Autómatas [SCB-1015]

final de la línea, sin ningún carácter que le siga.

| indica la disyuntiva “o,” para que la expresión regex coincida con cualquiera de las palabras de la lista.

\s coincide con un carácter de espacio. Utilízalo para separar las palabras en una frase.

Coincidencia de una palabra con distintas grafías o con caracteres especiales

Ejemplo de

uso

Coincidencia con la palabra "viagra" y con algunas de las alteraciones que utilizan los emisores de spam, por

ejemplo:

vi@gra

v1agra

v1@gra

v!@gr@

Ejemplo de

regex

v[i!1][a@]gr[a@]

Notas \W no se incluye, por lo que pueden aparecer otros caracteres antes o después de las variaciones del

término viagra. Por ejemplo, la expresión regex coincide igualmente con viagra en el texto siguiente:

viagra!! o ***viagra***

[i!1] coincide con los caracteres i, !, o 1 en la segunda posición de carácter de la palabra.

Fecha: 14/02/2015 Página 11

Lenguajes y Autómatas [SCB-1015]

Coincidencia de una palabra con caracteres de variables

Ejemplo

de uso

Coincidencia con cualquier URL que contenga el texto correonoadmitido.com, por ejemplo:

correonoadmitido1.com

correonoadmitido12.com

correonoadmitido3.com

correonoadmitido.basura.com

correonoadmitido-basura.com

Ejemplo

de regex

correonoadmitido(\w.+%\-){0,25}\.com

Notas [\w.+\-] coincide con cualquier carácter (a-z, A-Z, 0-9 o guión bajo), una coma, un signo más, un signo de

porcentaje o un guión. Son los únicos caracteres válidos en una URL. Ten en cuenta que el carácter \- (que

indica un guión) debe ir al final de la lista de caracteres dentro de los corchetes.

{0,25} indica que, en el conjunto de caracteres anterior, puede haber entre 0 y 25 caracteres después del

texto correonoadmitido. La configuración de correo relacionada con el cumplimiento del contenido

admite la coincidencia de hasta 25 caracteres para cada conjunto de caracteres en una expresión regular.

El carácter \ antes del guión y del punto actúa de carácter de “escape”, es decir, indica que el guión y el

punto no son caracteres especiales regex por sí mismos. Ten en cuenta que no es necesario incluir un

carácter de escape para el punto dentro de los corchetes.

Fecha: 14/02/2015 Página 12

Lenguajes y Autómatas [SCB-1015]

Coincidencia con cualquier dirección de correo electrónico de un determinado dominio

Ejemplo

de uso

Coincidencia con cualquier dirección de correo electrónico de los

dominios yahoo.com, hotmail.com ygmail.com.

Ejemplo

de regex

(\W|^)[\w.+\-]{0,25}@(yahoo|hotmail|gmail)\.com(\W|$)

Notas \W coincide con cualquier carácter que no sea una letra, un número o un guión bajó. Impide que la

expresión regex coincida con caracteres que precedan o que sigan a la dirección de correo electrónico.

^ coincide con el inicio de una nueva línea. Permite a la expresión regex coincidir con la dirección si

aparece al principio de la línea, sin ningún carácter que le preceda.

$ coincide con el final de una línea. Permite a la expresión regex coincidir con la dirección si aparece al final

de la línea, sin ningún carácter que le siga.

[\w.\-] coincide con cualquier carácter (a-z, A-Z, 0-9 o guión bajo), una punto, un signo más o un guión.

Estos son los caracteres válidos más utilizados en la primera parte de una dirección de correo electrónico.

Ten en cuenta que el carácter \- (que indica un guión) debe ir al final de la lista de caracteres dentro de los

corchetes.

El carácter \ antes del guión y del punto actúa de carácter de “escape”, es decir, indica que el guión y el

punto no son caracteres especiales regex por sí mismos. Ten en cuenta que no es necesario incluir un

carácter de escape para el punto dentro de los corchetes.

{0,25} indica que, en el conjunto de caracteres anterior, puede haber entre 0 y 25 caracteres antes del

símbolo @. La configuración de correo relacionada con el cumplimiento del contenido admite la

coincidencia de hasta 25 caracteres para cada conjunto de caracteres en una expresión regular.

El formato (...) agrupa los dominios, mientras que el carácter | que los separa indica la disyuntiva “o”.

Fecha: 14/02/2015 Página 13

Lenguajes y Autómatas [SCB-1015]

Coincidencia con cualquier dirección IP de un intervalo de direcciones

Ejemplo

de uso

Coincidencia con cualquier dirección IP que se incluya en el intervalo 192.168.1.0 - 192.168.1.255.

Ejemplos

de regex

Ejemplo 1: 192\.168\.1\.

Ejemplo 2: 192\.168\.1\.\d{1,3}

Notas El carácter \ antes de cada punto sirve de carácter de “escape”, es decir, indica que el punto no es un

carácter especial regex por sí mismo.

En el ejemplo 1, no se incluye ningún carácter después del último punto, por lo que la expresión regex

coincide con cualquier dirección IP que empiece por 192.168.1., independientemente del número que le

siga.

En el ejemplo 2, \d coincide con cualquier cifra entre el 0 y el 9 después del último punto, y {1,3} indica

que pueden aparecer entre uno y tres números después del último punto. En este caso, la expresión regex

coincide con cualquier dirección IP completa que empiece por 192.168.1.. Ten en cuenta que esta

expresión también coincide con direcciones IP no válidas, por ejemplo,192.168.1.999.

Coincidencia con un formato alfanumérico

Ejemplo

de uso

Coincidencia con los números de pedido de la empresa. Hay varios formatos posibles, por ejemplo:

Fecha: 14/02/2015 Página 14

Lenguajes y Autómatas [SCB-1015]

PO nn-nnnnn

PO-nn-nnnn

PO# nn nnnn

PO#nn-nnnn

PO nnnnnn

Ejemplo

de regex

(\W|^)po[#\-]{0,1}\s{0,1}\d{2}[\s-]{0,1}\d{4}(\W|$)

Notas \W coincide con cualquier carácter que no sea una letra, un número o un guión bajo. Impide que la

expresión regex coincida con caracteres que precedan o que sigan al número.

^ coincide con el inicio de una nueva línea. Permite a la expresión regex coincidir con el número si aparece

al principio de la línea, sin ningún carácter que le preceda.

$ coincide con el final de una línea. Permite a la expresión regex coincidir con el número si aparece al final

de la línea, sin ningún carácter que le siga.

[#\-] coincide con el símbolo de almohadilla o con un guión después de las letras "po", mientras que {0,1}

indica que uno de esos caracteres puede aparecer una vez o ninguna. Ten en cuenta que el carácter \- (que

indica un guión) debe ir al final de la lista de caracteres dentro de los corchetes.

\s coincide con un espacio, y {0,1} indica que puede aparecer un espacio una vez o ninguna.

\d coincide con cualquier cifra del 0 al 9, y {2} indica que deben aparecer exactamente 2 dígitos en esta

posición en el número.

Fecha: 14/02/2015 Página 15

Lenguajes y Autómatas [SCB-1015]