R Language
Expresiones regulares (expresiones regulares)
Buscar..
Introducción
Las expresiones regulares (también llamadas "regex" o "regexp") definen patrones que pueden compararse con una cadena . Escriba ?regex
para la documentación oficial de R y consulte Regex Docs para obtener más detalles. El 'gotcha' más importante que no se aprenderá en la regex / temas de SO es que la mayoría de las funciones de R-regex necesitan el uso de barras invertidas emparejadas para escapar en un parámetro de pattern
.
Observaciones
Clases de personajes
-
"[AB]"
podría ser A o B -
"[[:alpha:]]"
podría ser cualquier letra -
"[[:lower:]]"
significa cualquier letra minúscula. Tenga en cuenta que"[az]"
está cerca pero no coincide, por ejemplo,ú
. -
"[[:upper:]]"
representa cualquier letra mayúscula. Tenga en cuenta que"[AZ]"
está cerca pero no coincide, por ejemplo,Ú
. -
"[[:digit:]]"
significa cualquier dígito: 0, 1, 2, ... o 9 y es equivalente a"[0-9]"
.
Cuantificadores
+
, *
y ?
Aplicar como de costumbre en regex. - +
coincide al menos una vez, *
coincide con 0 o más veces, y ?
coincide con 0 o 1 vez.
Indicadores de inicio y final de línea.
Puede especificar la posición de la expresión regular en la cadena:
-
"^..."
que la expresión regular esté al principio de la cadena -
"...$"
que la expresión regular esté al final de la cadena
Diferencias de otros idiomas
Tenga en cuenta que las expresiones regulares en R a menudo son ligeramente diferentes de las expresiones regulares que se usan en otros idiomas.
R requiere escapes de doble barra diagonal inversa (porque
"\"
ya implica escapar en general en cadenas R), por lo que, por ejemplo, para capturar espacios en blanco en la mayoría de los motores de expresión regular, simplemente se deben escribir\s
, vs.\\s
en R .Los caracteres UTF-8 en R deben escaparse con una U mayúscula, por ejemplo,
[\U{1F600}]
y[\U1F600]
coinciden con 😀, mientras que en, por ejemplo, Ruby, esto coincidiría con una u minúscula.
Recursos adicionales
El siguiente sitio reg101 es un buen lugar para verificar expresiones regulares en línea antes de usar R-script.
El wikibook de Programación R tiene una página dedicada al procesamiento de texto con muchos ejemplos que usan expresiones regulares.
Eliminando el espacio en blanco
string <- ' some text on line one;
and then some text on line two '
Recorte de espacios en blanco
El "recorte" de los espacios en blanco generalmente se refiere a la eliminación de los espacios en blanco iniciales y finales de una cadena. Esto se puede hacer usando una combinación de los ejemplos anteriores. gsub
se utiliza para forzar el reemplazo tanto en la gsub
anterior como en la posterior.
Antes de la R 3.2.0
gsub(pattern = "(^ +| +$)",
replacement = "",
x = string)
[1] "some text on line one; \nand then some text on line two"
R 3.2.0 y superior
trimws(x = string)
[1] "some text on line one; \nand then some text on line two"
Eliminando Leading Whitespace
Antes de la R 3.2.0
sub(pattern = "^ +",
replacement = "",
x = string)
[1] "some text on line one; \nand then some text on line two "
R 3.2.0 y superior
trimws(x = string,
which = "left")
[1] "some text on line one; \nand then some text on line two "
Eliminar los espacios en blanco finales
Antes de la R 3.2.0
sub(pattern = " +$",
replacement = "",
x = string)
[1] " some text on line one; \nand then some text on line two"
R 3.2.0 y superior
trimws(x = string,
which = "right")
[1] " some text on line one; \nand then some text on line two"
Eliminar todo el espacio en blanco
gsub(pattern = "\\s",
replacement = "",
x = string)
[1] "sometextonlineone;andthensometextonlinetwo"
Tenga en cuenta que esto también eliminará los caracteres en blanco, como las pestañas ( \t
), las nuevas líneas ( \r
y \n
) y los espacios.
Valide una fecha en un formato "YYYYMMDD"
Es una práctica común nombrar archivos usando la fecha como prefijo en el siguiente formato: YYYYMMDD
, por ejemplo: 20170101_results.csv
. Una fecha en tal formato de cadena se puede verificar utilizando la siguiente expresión regular:
\\d{4}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])
La expresión anterior considera fechas desde el año: 0000-9999
, meses entre: 01-12
y días 01-31
.
Por ejemplo:
> grepl("\\d{4}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])", "20170101")
[1] TRUE
> grepl("\\d{4}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])", "20171206")
[1] TRUE
> grepl("\\d{4}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])", "29991231")
[1] TRUE
Nota : valida la sintaxis de fecha, pero podemos tener una fecha incorrecta con una sintaxis válida, por ejemplo: 20170229
(2017 no es un año bisiesto).
> grepl("\\d{4}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])", "20170229")
[1] TRUE
Si desea validar una fecha, puede hacerlo a través de esta función definida por el usuario:
is.Date <- function(x) {return(!is.na(as.Date(as.character(x), format = '%Y%m%d')))}
Entonces
> is.Date(c("20170229", "20170101", 20170101))
[1] FALSE TRUE TRUE
Validar abreviaturas postales de los Estados Unidos
La siguiente regex
incluye 50 estados y también Commonwealth / Territory (consulte www.50states.com ):
regex <- "(A[LKSZR])|(C[AOT])|(D[EC])|(F[ML])|(G[AU])|(HI)|(I[DLNA])|(K[SY])|(LA)|(M[EHDAINSOT])|(N[EVHJMYCD])|(MP)|(O[HKR])|(P[WAR])|(RI)|(S[CD])|(T[NX])|(UT)|(V[TIA])|(W[AVIY])"
Por ejemplo:
> test <- c("AL", "AZ", "AR", "AJ", "AS", "DC", "FM", "GU","PW", "FL", "AJ", "AP")
> grepl(us.states.pattern, test)
[1] TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE
>
Nota :
Si desea verificar solo los 50 estados, le recomendamos utilizar el conjunto de datos R: state.abb
from state
, por ejemplo:
> data(state)
> test %in% state.abb
[1] TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE
Obtenemos TRUE
solo para las abreviaturas de 50 estados: AL, AZ, AR, FL
.
Validar números de teléfono de Estados Unidos
La siguiente expresión regular:
us.phones.regex <- "^\\s*(\\+\\s*1(-?|\\s+))*[0-9]{3}\\s*-?\\s*[0-9]{3}\\s*-?\\s*[0-9]{4}$"
Valida un número de teléfono en la forma de: +1-xxx-xxx-xxxx
, incluidos los espacios en blanco iniciales / finales al principio / final de cada grupo de números, pero no en el medio, por ejemplo: +1-xxx-xxx-xx xx
no es valido El -
delimitador puede ser sustituido por espacios en blanco: xxx xxx xxx
o sin delimitador: xxxxxxxxxx
. El prefijo +1
es opcional.
Vamos a comprobarlo:
us.phones.regex <- "^\\s*(\\+\\s*1(-?|\\s+))*[0-9]{3}\\s*-?\\s*[0-9]{3}\\s*-?\\s*[0-9]{4}$"
phones.OK <- c("305-123-4567", "305 123 4567", "+1-786-123-4567",
"+1 786 123 4567", "7861234567", "786 - 123 4567", "+ 1 786 - 123 4567")
phones.NOK <- c("124-456-78901", "124-456-789", "124-456-78 90",
"124-45 6-7890", "12 4-456-7890")
Casos válidos:
> grepl(us.phones.regex, phones.OK)
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE
>
Casos no válidos:
> grepl(us.phones.regex, phones.NOK)
[1] FALSE FALSE FALSE FALSE FALSE
>
Nota :
-
\\s
Coincide con cualquier espacio, tabulador o carácter de nueva línea
Escapando personajes en patrones regex R
Dado que tanto R como regex comparten el carácter de escape, "\"
, la construcción de patrones correctos para grep
, sub
, gsub
o cualquier otra función que acepte un argumento de patrón a menudo requerirá el emparejamiento de barras invertidas. Si construye un vector de caracteres de tres elementos en el que un elemento tiene un salto de línea, otro un carácter de tabulación y otro no, y su deseo es convertir el salto de línea o la pestaña en 4 espacios, entonces se necesita una sola barra invertida para la construcción. pero parejó barras invertidas para emparejar:
x <- c( "a\nb", "c\td", "e f")
x # how it's stored
# [1] "a\nb" "c\td" "e f"
cat(x) # how it will be seen with cat
#a
#b c d e f
gsub(patt="\\n|\\t", repl=" ", x)
#[1] "a b" "c d" "e f"
Tenga en cuenta que el argumento de patrón (que es opcional si aparece primero y solo necesita una ortografía parcial) es el único argumento que requiere esta duplicación o emparejamiento. El argumento de reemplazo no requiere la duplicación de caracteres que necesitan ser escapados. Si deseara que todos los saltos de línea y las ocurrencias de 4 espacios se reemplacen con pestañas, sería:
gsub("\\n| ", "\t", x)
#[1] "a\tb" "c\td" "e\tf"
Diferencias entre Perl y expresiones regulares POSIX
Hay dos motores de expresiones regulares siempre muy diferentes implementados en R. El valor predeterminado se denomina POSIX-consistente; todas las funciones de expresiones regulares en R también están equipadas con una opción para activar el último tipo: perl = TRUE
.
Mirar adelante / mirar atrás
perl = TRUE
permite mirar hacia adelante y mirar hacia atrás en expresiones regulares.
-
"(?<=A)B"
coincide con una apariencia de la letraB
solo si está precedida porA
, es decir,"ABACADABRA"
coincidiría, pero"abacadabra"
y"aBacadabra"
no.