#En este script vamos a hacer unos ejercicios prácticos para saber como usar #expresiones regulares en lenguaje PCRE, las posibilidades son infinitas: #Las funciones que vamos a usar en R son: grepl(pattern = ,x = ,perl = T) #EXPLICACIÓN: grepl nos devuelve un booleano, nos dice si en el texto proporcionado #en x está o no está el patrón que escogimos. gregexpr(pattern = ,text = ,perl = ) #EXPLICACIÓN: esta función nos dice cuáles son los índices del match en el texto dado ese patrón #retorna -1 si no hay match. Esta función es muy necesaria para usar regmatches regmatches(x = ,m = ,invert = F) #EXPLICACIÓN: Esta función nos devuelve explicitamente el texto dados unos índices, cuando se #usa en combinación con gregexpr, nos sirve para obtener el texto que hizo match. gsub(pattern = ,replacement = ,x = ,perl = ) #EXPLICACIÓN: Esta función súper útil nos reemplaza lo que se empareje con el patrón por el #texto suministrado. #Las expresiones regulares se le pasan a estas funciones como un string al #parámetro pattern, veamos algunos ejemplos # # #EJEMPLO 1: Hagamosle match a todas las palabras que empiezan por mayúscula: test1 = "en este Texto queremos Hacerle Match a todas las Palabras que inicien Con mayúscula." patron= "[A-Z]\\w+" grepl(pattern = patron,x = test1,perl = T) #Esto nos retorna apenas un booleano, lo cual es poco informativo. gregexpr(pattern = patron,text = test1,perl = T) #Esto en cambio nos da un conjunto de índices, resumidos por la posición inicial y la longitud. #Pero no nos dice cuáles palabras fueron... indexes=gregexpr(pattern = patron,text = test1,perl = T) regmatches(x = test1,m=indexes) # # #################################################### #Ensayemos hacer una expresión regular de palabras que no empiecen por vocal test2 = c("Antecedentes","volición","Culpa","ominoso","Ultraje","condena") patron="" grepl(pattern = patron,x = test1,perl = T) #################################################### #Probemos con algunas disjunciones, queremos todas las palabras que terminan en "ar" y "es" test3= "Llevo mal el fallecimiento de Flaco, tu amigo, pero no quiero que tú te duelas más de lo justo. El que no te duelas, difícilmente me atreveré a exigírtelo, y eso que sé que es mejor. ¿Pero a quién le tocará esa firmeza de ánimo, si no es a alguien ya muy elevado por encima de la fortuna? Incluso a ése le pellizcará ese suceso, pero sólo le pellizcará. A nosotros, sin embargo, se nos puede perdonar que nos hayamos deslizado en las lágrimas, si no corrieron en demasía, si nosotros mismos las cortamos. Ni estén secos los ojos por la pérdida de un amigo ni manen a borbotones; se deben verter algunas lágrimas, no llorar sin tregua. ¿Te parezco imponer una dura ley, cuando el más grande de los poetas griegos concedió el derecho de llorar solamente por un día, cuando contó que incluso Níobe había pensado en la comida? " patron= "" indexes=gregexpr(pattern = patron,text = test1,perl = T) regmatches(x = test1,m=indexes) ################################################### #Ahora veamos un poco de cuantificadores, #EJERCICIO: Quiero todos los números de al menos 5 dígitos, que estén terminados opcionalmente #en la cadena abc test4= "bar bar foo 1234 bar foo 12abc 12345abc foo bar ros 48298abc 838383838383 bar bar ros" patron= "" indexes=gregexpr(pattern = patron,text = test1,perl = T) regmatches(x = test1,m=indexes) #EJERCICIO: Excelente, que tal si hacemos algo de trabajo de corrección? por que no tratamos de #normalizar en un tweet todas las veces que la gente repite muchas veces la misma letra test5= "Usted apeeeeeeenas está empezandoooooo a leer el texto que acaaaaaba de terminar de leer" #PISTA: Hay que usar capture groups! patron= "" reemplazo= "" gsub(pattern = patron,replacement = reemplazo,x = test5,perl = T) ############################################### #LOOKFORWARD Y LOOKBEHIND #EJERCICIO: Encontremos todos los números que estén antecedidos por un símbolo pesos (precios) test6= "La empresa Quantil S.A.S. con NIT 800.230.374-05 facturó $800.000.000.000 en el año 2016 posicionándose así en el grupo de empresas que ganan más de $100.000.000.000 en Colombia ¿Cómo lo lograron?" #Recuerde que el lookbehind necesita PERL=T, y que la sintaxis es (?<= reg2)reg1 #Tal vez tenga que usar [] pues los números tienen puntos en la mitad... patron= "" indexes=gregexpr(pattern = patron,text = test6,perl = T) regmatches(x = test6,m=indexes) #EJERCICIO: En los siguientes textos, ubique la expresión de tres palabras que sigue a la palabra #"Quantil" test7= c("Lo que más tiene Quantil es capital humano","Quantil está creciendo mucho","Creo que nuestra empresa va a contratar con Quantil el año entrante") #piense primero en un patrón para ubicar tres palabras separadas por espacios... patron="" indexes=gregexpr(pattern = patron,text = test1,perl = T) regmatches(x = test1,m=indexes) #################################################################################### #Ahora que pasa si intentamos algo negativo y un poco variable? #EJERCICIO 4: Haga una expresión regular que empareje con todas las palabras #excepto las que empiezan por abc y xyz. test8= "hola hola chao abcchao xyzumba arroz abcgula chao chao abcxyz hola xyzalvaring" patron="" indexes=gregexpr(pattern = patron,text = test8, perl = T) regmatches(x = test8,m=indexes) #EJERCICIO 5: Haga una expresión regular que ubique todos los números no precios en el texto test6= "La empresa Quantil S.A.S. con NIT 800.230.374-05 facturó $800.000.000.000 en el año 2016 posicionándose así en el grupo de empresas que ganan más de $100.000.000.000 en Colombia ¿Cómo lo lograron?" #Recuerde usar el súper truco con (*SKIP)(*FAIL) patron= "" indexes=gregexpr(pattern = patron,text = test8, perl = T) regmatches(x = test8,m=indexes) #EJERCICIO 6: Encuentre todas las expresiones que empiezan en un BAR y terminan en un FOO (partir) test9= "Sí, así es como BAR envenenan o pegan BAR un tiro a FOO las esposas o a las amantes. FOO Basta tomar un FOO revolver, BAR llamarla y, en vez de un abrazo, dispararle en el pecho. FOO Y se acabó. Porque BAR ella es el BAR diablo. El mismo diablo. FOO Porque BAR se ha apoderado de mí FOO contra mi voluntad. ¡Matar! Sí. Sólo hay BAR dos salidas: matar a mi mujer o a ella. Porque la vida es imposible, se dijo y BAR acercándose a la BAR mesa, sacó de ella un revolver FOO y, después de examinarlo (faltaba un cartucho), se lo BAR guardó en el bolsillo del BAR pantalón." #Recuerde volver al cuantificador perezoso patron= "" indexes=gregexpr(pattern = patron,text = test9, perl = T) regmatches(x = test9,m=indexes)