aplicaciones de las er
DESCRIPTION
dsadsdsdsadsadsadasdasdasdasdsaddsdasdTRANSCRIPT
|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]