lunes, 9 de enero de 2023

Expresiones regulares II

Posted by q3it on lunes, enero 09, 2023 in


Las expresiones regulares tienen una parte más compleja pero con mucho potencial, estas expresiones regulares denominadas como extendidas las vamos a tener que habilitar para el comando grep utilizando la opción -E mayúscula. Lo que vamos a ver es repetición, nosotros vamos a tener una expresión y vamos a indicar cuántas veces tiene que aparecer esta expresión. El primer carácter del que vamos a hablar es la ? interrogación y esta indica cero o una vez. ¿Qué significa esto? Imaginemos que nosotros tenemos una expresión, que estamos buscando un número y nosotros queremos que esto sea opcional, que pueda aparecer el número dos, pues simplemente ponemos una interrogación a su derecha y entonces ya lo marcamos como opcional. Si todo lo demás se cumple y no hay un dígito lo mostrará, pero además si hay un dígito también lo mostrará. 
 
Tenemos un fichero llamado numeros.txt que tiene una serie de Fibonacci hasta un número de cuatro dígitos. 
 

 
Si nosotros queremos mostrar los números que sean menores de 100, es decir, que tenga uno o dos dígitos entonces podemos utilizar la interrogación ? para nuestros propósito, utilizamos grep -E mayúsculas para las extendidas, tenemos que iniciar la línea y luego sabemos que va a ir un número y luego opcionalmente va ir otro número para marcarlos como opcional, es decir, cero o una vez entonces utilizaremos la opción interrogante, decimos que se acaba la línea, cerramos nuestras comillas y luego indicamos el fichero que nosotros queremos buscar.
 
 
El segundo caso es el asterisco y funciona igual, pero en este caso en vez de estar una vez lo que estará son cero o más veces, si nosotros repetimos la instrucción anterior pero cambiándole la interrogación por el asterisco * buscará los números y si aparecen bien, pero si hay una serie de números también lo mostrará.
 
 
Pero si filtramos un poco más y en vez de poner de 0 a 9 ponemos de 0 a 5, veremos que solo nos mostrará los números que empiezan por un dígito y a continuación vaya un número que sea que menor que 6.
 
 
Cuando nosotros no queremos ponerlo opcional sino que tiene que aparecer un número uno o más veces entonces utilizaremos el más lo mismo. Le añadimos un más + indicando que esto ya no es opcional tiene que aparecer una o más veces y vemos la diferencia cuando lo utilizamos con nuestro comando aquí, que ahora no nos muestra sólo los que sean de un dígito por qué nosotros ahora estamos forzando que a continuación tiene que haber un número. Entonces simplemente nos mostrará los que tienen dos y tres dígitos que cumpla los requisitos que nosotros hemos puesto.
 
 
Si nosotros queremos que aparezca unas cuantas veces entonces utilizaremos las llaves {N} y luego cerramos las llaves, esto es lo que nos dirá es que tiene que aparecer el número de veces que nosotros le indicamos, por ejemplo, de 0 a 9 y nosotros ponemos el número 3, indicando que estamos buscando tres dígitos.

 
Nosotros también podemos poner un rango {n-m} entonces buscará que se repita la expresión a su izquierda entre n y m veces.

 
Si nosotros no queremos especificar un máximo podemos poner simplemente el número dejarlo vacío y cerrar la llave {n,}.
 
 
Como vemos si ponemos un 3 buscará números que tengan tres dígitos o más.
 
El otro comando del que voy a hablar es paréntesis () que significa agrupar. Por ejemplo, si queremos buscar los números que tienen un dígito o tienen tres dígitos, nosotros podemos empezar nuestra expresión sabiendo que va a empezar con un dígito, y a continuación puede tener dos dígitos más porque nosotros estamos buscando números de tres dígitos.
 
Si nosotros lo especificamos de esta manera, lo que buscará son tres números y nosotros podríamos hacer lo que hemos aprendido en la clase de greep, que simplemente poniendo un -e y más adelante otro nos mostrará la primera expresión, los números que tengan tres dígitos y con la segunda expresión los que tengan un número.
 
 
Si nosotros queremos realizar esto en una expresión regular sola podríamos pensar
que poniendo aquí interrogación nos mostraría nuestro resultado, pero si nos  fijamos, lo que nos muestra en pantalla son los números de un dígito, que es correcto porque nosotros estamos obligando aquí a que haya un dígito y luego opcionalmente que haya otro dígito, pero los que son dos dígitos también lo cumplen, porque fijar un dígito es obligatorio y el segundo es opcional. En este caso se cumple y el tercero vuelve a ser opcional entonces muestra estos números 
 

Si solo queremos demostrar cuál era nuestro propósito de 1 o 3, tenemos que agrupar, porque cuando hablé de repetición, solo hacía efecto a la expresión que estaba a su izquierda es decir a la anterior. Si hay más, simplemente a la última que aparece a su izquierda, si nosotros queremos que hayan más expresiones opcionales entonces utilizaremos nuestros paréntesis (), en nuestro caso es muy simple, sabemos que tiene que haber obligatoriamente un dígito y luego opcionalmente tienen que haber dos dígitos, pues estos dos dígitos los ponemos entre paréntesis y suponemos que sean opcionales y vemos que muestra lo que nosotros buscábamos.
 
 
Y otra forma de hacerlo es con el pipe | "tubería" que significa alternancia. Nosotros vamos a tener una expresión luego vamos a tener el pipe y luego otra expresión. Imaginemos que este | mostrará, filtrará si la condición es correcta a o la condición b es correcta, en nuestro caso sabemos que estamos buscando un dígito, pues ponemos un pipe y luego lo que estamos buscando, que son tres dígitos. Pues añadimos los tres dígitos, y esto todo lo ponemos entre paréntesis porque aquí tenemos que especificar que en la parte izquierda de nuestra tubería hay un dígito y en la parte derecha hay tres dígitos, si nosotros no especificamos este paréntesis pensará que buscará un dígito o un dígito a la derecha, siempre que nosotros tengamos que agruparlos vamos a tener que utilizar los paréntesis para indicar que hay más expresiones que las que nosotros queremos.

 
En la expresión de la izquierda está buscando un número y en la expresión de la derecha está buscando tres números, aquí para hacerlo más corto podíamos cambiar y añadir las llaves, especificamos que tenga que aparecer tres veces.