R Language
Ajuste de patrón y reemplazo
Buscar..
Introducción
Este tema cubre los patrones de cadena coincidentes, además de extraerlos o reemplazarlos. Para detalles sobre la definición de patrones complicados vea Expresiones Regulares .
Sintaxis
grep ("consulta", "asunto", optional_args)
grepl ("consulta", "asunto", optional_args)
gsub ("(group1) (group2)", "\\ group #", "subject")
Observaciones
Diferencias de otros idiomas
Los símbolos de expresiones regulares con escape (como \1
) deben escaparse por segunda vez (como \\1
), no solo en el argumento de pattern
, sino también en el replacement
de sub
y gsub
.
De forma predeterminada, el patrón para todos los comandos (grep, sub, regexpr) no es Perl Compatible Regular Expression (PCRE), por lo que no se admiten algunas cosas, por ejemplo, lookarounds. Sin embargo, cada función acepta un argumento perl=TRUE
para habilitarlos. Vea el tema R Expresiones regulares para más detalles.
Paquetes especializados
- cuerdas
- cuerda
Haciendo sustituciones
# example data
test_sentences <- c("The quick brown fox quickly", "jumps over the lazy dog")
Hagamos rojo al zorro marrón:
sub("brown","red", test_sentences)
#[1] "The quick red fox quickly" "jumps over the lazy dog"
Ahora, hagamos que el "fast"
zorro actúe "fastly"
. Esto no lo hará:
sub("quick", "fast", test_sentences)
#[1] "The fast red fox quickly" "jumps over the lazy dog"
sub
solo hace el primer reemplazo disponible, necesitamos gsub
para el reemplazo global :
gsub("quick", "fast", test_sentences)
#[1] "The fast red fox fastly" "jumps over the lazy dog"
Consulte Modificar cadenas por sustitución para obtener más ejemplos.
Encontrar coincidencias
# example data
test_sentences <- c("The quick brown fox", "jumps over the lazy dog")
¿Hay un partido?
grepl()
se usa para verificar si una palabra o expresión regular existe en una cadena o vector de caracteres. La función devuelve un vector VERDADERO / FALSO (o "Booleano").
Observe que podemos verificar cada cadena para la palabra "fox" y recibir un vector booleano a cambio.
grepl("fox", test_sentences)
#[1] TRUE FALSE
Ubicaciones de los partidos
grep
toma una cadena de caracteres y una expresión regular. Devuelve un vector numérico de índices. Esto devolverá la oración que contiene la palabra "zorro".
grep("fox", test_sentences)
#[1] 1
Valores coincidentes
Para seleccionar oraciones que coincidan con un patrón:
# each of the following lines does the job:
test_sentences[grep("fox", test_sentences)]
test_sentences[grepl("fox", test_sentences)]
grep("fox", test_sentences, value = TRUE)
# [1] "The quick brown fox"
Detalles
Dado que el patrón "fox"
es solo una palabra, en lugar de una expresión regular, podríamos mejorar el rendimiento (con grep
o grepl
) especificando grepl
fixed = TRUE
.
grep("fox", test_sentences, fixed = TRUE)
#[1] 1
Para seleccionar oraciones que no coincidan con un patrón, se puede usar grep
con invert = TRUE
; o siga las reglas de -grep(...)
con -grep(...)
o !grepl(...)
.
Tanto en grepl(pattern, x)
como en grep(pattern, x)
, el parámetro x
está vectorizado , el parámetro pattern
no. Como resultado, no puede usarlos directamente para hacer coincidir el pattern[1]
con x[1]
, el pattern[2]
con x[2]
, etc.
Resumen de partidos
Después de ejecutar, por ejemplo, el comando grepl
, tal vez desee obtener una visión general de cuántas coincidencias es TRUE
o FALSE
. Esto es útil, por ejemplo, en el caso de grandes conjuntos de datos. Para ello ejecute el comando de summary
:
# example data
test_sentences <- c("The quick brown fox", "jumps over the lazy dog")
# find matches
matches <- grepl("fox", test_sentences)
# overview
summary(matches)
Partido individual y global.
Cuando se trabaja con expresiones regulares, un modificador para PCRE es g
para la coincidencia global.
En R, las funciones de comparación y reemplazo tienen dos versiones: primera coincidencia y coincidencia global:
sub(pattern,replacement,text)
reemplazará la primera aparición del patrón por reemplazo en textogsub(pattern,replacement,text)
hará lo mismo que sub pero para cada aparición del patrónregexpr(pattern,text)
devolverá la posición de coincidencia para la primera instancia del patróngregexpr(pattern,text)
devolverá todas las coincidencias.
Algunos datos aleatorios:
set.seed(123)
teststring <- paste0(sample(letters,20),collapse="")
# teststring
#[1] "htjuwakqxzpgrsbncvyo"
Veamos cómo funciona esto si queremos reemplazar las vocales por otra cosa:
sub("[aeiouy]"," ** HERE WAS A VOWEL** ",teststring)
#[1] "htj ** HERE WAS A VOWEL** wakqxzpgrsbncvyo"
gsub("[aeiouy]"," ** HERE WAS A VOWEL** ",teststring)
#[1] "htj ** HERE WAS A VOWEL** w ** HERE WAS A VOWEL** kqxzpgrsbncv ** HERE WAS A VOWEL** ** HERE WAS A VOWEL** "
Ahora veamos cómo podemos encontrar una consonante seguida inmediatamente por una o más vocales:
regexpr("[^aeiou][aeiou]+",teststring)
#[1] 3
#attr(,"match.length")
#[1] 2
#attr(,"useBytes")
#[1] TRUE
Tenemos una coincidencia en la posición 3 de la cadena de longitud 2, es decir: ju
Ahora si queremos conseguir todos los partidos:
gregexpr("[^aeiou][aeiou]+",teststring)
#[[1]]
#[1] 3 5 19
#attr(,"match.length")
#[1] 2 2 2
#attr(,"useBytes")
#[1] TRUE
Todo esto es realmente genial, pero esto solo le da un uso de posiciones de coincidencia y eso no es tan fácil de obtener lo que se regmatches
, y aquí viene regmatches
, su único propósito es extraer la cadena coincidente de regexpr, pero tiene una sintaxis diferente.
Guardemos nuestras coincidencias en una variable y luego las extraemos de la cadena original:
matches <- gregexpr("[^aeiou][aeiou]+",teststring)
regmatches(teststring,matches)
#[[1]]
#[1] "ju" "wa" "yo"
Esto puede sonar extraño como para no tener un atajo, pero esto permite la extracción de otra cadena mediante las coincidencias de la primera (piense en la comparación de dos vectores largos donde sabe que hay un patrón común para la primera, pero no para la segunda, esto permite una fácil comparación):
teststring2 <- "this is another string to match against"
regmatches(teststring2,matches)
#[[1]]
#[1] "is" " i" "ri"
Nota de atención: de manera predeterminada, el patrón no es Expresión regular compatible con Perl, algunas cosas como las reparaciones no son compatibles, pero cada función presentada aquí permite que el argumento perl=TRUE
habilite.
Encuentra coincidencias en grandes conjuntos de datos
En el caso de grandes conjuntos de datos, la llamada de grepl("fox", test_sentences)
no funciona bien. Los grandes conjuntos de datos son, por ejemplo, sitios web rastreados o millones de Tweets, etc.
La primera aceleración es el uso de la opción perl = TRUE
. Aún más rápida es la opción fixed = TRUE
. Un ejemplo completo sería:
# example data
test_sentences <- c("The quick brown fox", "jumps over the lazy dog")
grepl("fox", test_sentences, perl = TRUE)
#[1] TRUE FALSE
En el caso de la minería de textos, a menudo se utiliza un corpus. Un corpus no puede ser usado directamente con grepl
. Por lo tanto, considere esta función:
searchCorpus <- function(corpus, pattern) {
return(tm_index(corpus, FUN = function(x) {
grepl(pattern, x, ignore.case = TRUE, perl = TRUE)
}))
}