5 Opciones avanzadas y otras aplicaciones
Existen otras muchas posibilidades con las expresiones regulares, de entre ellas vamos a destacar algunas de las más relevantes. Por ello, en esta ocasión los datos sobre los que se van a aplicar son diferentes, usando ahora el primer capítulo de la novela Alice’s Adventures in Wonderland (Carroll 1865).
5.1 Lookarounds
De manera más avanzada, existe la opción de marcar elementos situados delante o detrás de un determinado carácter o cadena de caracteres o, a la inversa, localizar lo que no está precedido o seguido de ello. Una de sus utilidades está en realizar operaciones de extracción o reemplazo muy especificas que de otro modo no serían posibles o más complejas.
5.1.1 (?=)
Para localizar un elemento que precede a una expresión regular se puede usar el denominado positive lookahead
con (?=)
. Por ejemplo, con '.*'(?=\ssaid Alice)
podemos seleccionar las frases que dice Alice y por medio de str_extract()
extraer dichas frases.
## [1] "'which certainly was not here before,'" "'What a curious feeling!'"
## [3] "'for it might end, you know,'" "'Come, there’s no use in crying like that!'"
## [5] "'Well, I’ll eat it,'"
5.1.2 (?!)
Existe una versión negativa denominada negative lookahead
, con la que es posible localizar elementos que no vengan seguidos de un determinado patrón. Por ejemplo, con '.*'\sthought(?!\sAlice)
se seleccionarían todas las citas textual seguidas de thought
pero que tras ello no aparece el nombre de Alice.
## [1] "'and what is the use of a book,' thought" "'Well!' thought"
5.1.3 (?<=)
Además de positive lookahead
se encuentra positive lookbehind
. En este último, en lugar de marcar el patrón por la derecha de la cadena de texto que se quiere identificar se hace por la izquierda, permitiendo identificar elementos que están justo a continuación. Por ejemplo, con (?<='\ssaid\s)\w+
se busca el nombre del personaje que dice la cita.
## [1] "Alice" "Alice" "Alice" "Alice" "Alice"
5.1.4 (?<!)
En su versión negativa, negative lookbehind
, permite con (?<!)
seleccionar elementos que no vienen precedidos por un determinado patrón. Por ejemplo, con (?<!White\s)Rabbit.*
podemos seleccionar las frases sobre Rabbit
cuando inmediatamente delante no tiene la palabra White
.
## [1] "Rabbit-Hole"
## [2] "Rabbit say to itself, 'Oh dear! Oh dear! I shall be late!' (when she thought it over afterwards, it occurred to her that she ought to have wondered at this, but at the time it all seemed quite natural); but when the Rabbit actually took a watch out of its waistcoat-pocket, and looked at it, and then hurried on, Alice started to her feet, for it flashed across her mind that she had never before seen a rabbit with either a waistcoat-pocket, or a watch to take out of it, and burning with curiosity, she ran across the field after it, and fortunately was just in time to see it pop down a large rabbit-hole under the hedge."
## [3] "Rabbit was no longer to be seen: she found herself in a long, low hall, which was lit up by a row of lamps hanging from the roof."
5.2 Patrones de sustitución
Existen patrones específicos en los reemplazos. Una vez realizada una búsqueda en la que se establezcan varios conjuntos mediante el uso de los paréntesis ()
, mediante $
se puede reemplazar la cadena con uno de los conjuntos. Resulta de utilidad para cambiar el orden en cadenas de caracteres. Por ejemplo, buscando (White\s)(Rabbit\s)
y remplazando por $2$1
lo que conseguimos es sustituir White Rabbit
por Rabbit White
.
## [1] "So she was considering in her own mind (as well as she could, for the hot day made her feel very sleepy and stupid), whether the pleasure of making a daisy-chain would be worth the trouble of getting up and picking the daisies, when suddenly a Rabbit White with pink eyes ran close by her."
## [2] "Alice was not a bit hurt, and she jumped up on to her feet in a moment: she looked up, but it was all dark overhead; before her was another long passage, and the Rabbit White was still in sight, hurrying down it."