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 letra B solo si está precedida por A , es decir, "ABACADABRA" coincidiría, pero "abacadabra" y "aBacadabra" no.


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow