Recherche…


Introduction

Les expressions régulières (également appelées "regex" ou "regexp") définissent des modèles pouvant être associés à une chaîne . Tapez ?regex pour la documentation R officielle et consultez la documentation Regex pour plus de détails. Le plus important «gotcha» qui ne sera pas appris dans le SO regex / topics est que la plupart des fonctions R-regex ont besoin d'utiliser des barres obliques inverses pour s'échapper dans un paramètre de pattern .

Remarques

Classes de caractères

  • "[AB]" pourrait être A ou B
  • "[[:alpha:]]" pourrait être n'importe quelle lettre
  • "[[:lower:]]" signifie une lettre minuscule. Notez que "[az]" est proche mais ne correspond pas, par exemple, ú .
  • "[[:upper:]]" signifie une lettre majuscule. Notez que "[AZ]" est proche mais ne correspond pas, par exemple, Ú .
  • "[[:digit:]]" correspond à n'importe quel chiffre: 0, 1, 2, ... ou 9 et est équivalent à "[0-9]" .

Quantificateurs

+ , * et ? appliquer comme d'habitude dans regex. - + correspond au moins une fois, * correspond à 0 fois ou plus, et ? correspond à 0 ou 1 fois.

Indicateurs de début et de fin de ligne

Vous pouvez spécifier la position de l'expression régulière dans la chaîne:

  • "^..." force l'expression régulière au début de la chaîne
  • "...$" force l'expression régulière à la fin de la chaîne

Différences par rapport aux autres langues

Veuillez noter que les expressions régulières dans R semblent souvent légèrement différentes des expressions régulières utilisées dans d'autres langues.

  • R requiert des échappements à double barre oblique inverse (car "\" implique déjà une fuite en général dans les chaînes R), par exemple, pour capturer des espaces dans la plupart des moteurs d’expression, il suffit de taper \s , \\s dans R .

  • Les caractères UTF-8 dans R devraient être échappés avec un U majuscule, par exemple [\U{1F600}] et [\U1F600] match 😀, alors que, par exemple, Ruby, cela correspondrait à un minuscule u.

Ressources additionnelles

Le site reg101 suivant est un bon endroit pour vérifier les regex en ligne avant de les utiliser.

Le wikibook de programmation R comporte une page dédiée au traitement de texte avec de nombreux exemples utilisant des expressions régulières.

Éliminer les espaces blancs

string <- '    some text on line one; 
and then some text on line two     '

Tailler les espaces

L'espace de suppression consiste généralement à supprimer les espaces de début et de fin d'une chaîne. Cela peut être fait en utilisant une combinaison des exemples précédents. gsub est utilisé pour forcer le remplacement sur les deux matchs.

Avant 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 et supérieur

trimws(x = string)

[1] "some text on line one; \nand then some text on line two"

Supprimer les espaces blancs

Avant 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 et supérieur

trimws(x = string,
       which = "left")

[1] "some text on line one; \nand then some text on line two     "

Suppression d'espaces de fin

Avant 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 et supérieur

trimws(x = string,
       which = "right")

[1] "    some text on line one; \nand then some text on line two"

Supprimer tous les espaces

gsub(pattern = "\\s",   
     replacement = "",
     x = string)

[1] "sometextonlineone;andthensometextonlinetwo"

Notez que cela supprimera également les espaces blancs tels que les tabulations ( \t ), les nouvelles lignes ( \r et \n ) et les espaces.

Valider une date dans un format "AAAAMMJJ"

Il est courant de nommer les fichiers en utilisant la date comme préfixe au format suivant: YYYYMMDD , par exemple: 20170101_results.csv . Une date dans un tel format de chaîne peut être vérifiée en utilisant l'expression régulière suivante:

\\d{4}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])

L'expression ci-dessus considère les dates de l'année: 0000-9999 , les mois entre: 01-12 et les jours 01-31 .

Par exemple:

> 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

Remarque : Il valide la syntaxe de date, mais nous pouvons avoir une date incorrecte avec une syntaxe valide, par exemple: 20170229 (2017 ce n'est pas une année bissextile).

> grepl("\\d{4}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])", "20170229")
[1] TRUE

Si vous souhaitez valider une date, vous pouvez le faire via cette fonction définie par l'utilisateur:

is.Date <- function(x) {return(!is.na(as.Date(as.character(x), format = '%Y%m%d')))}

alors

> is.Date(c("20170229", "20170101", 20170101))
[1] FALSE  TRUE  TRUE

Valider les abréviations postales des États américains

La regex suivante comprend 50 états et aussi Commonwealth / Territory (voir 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])"

Par exemple:

> 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
> 

Note :

Si vous ne souhaitez vérifier que les 50 États, nous vous recommandons d'utiliser le jeu de données R: state.abb from state , par exemple:

> data(state)
> test %in% state.abb
[1]  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE    

Nous n'obtenons TRUE que pour les abréviations de 50 États: AL, AZ, AR, FL .

Valider les numéros de téléphone américains

L'expression régulière suivante:

us.phones.regex <- "^\\s*(\\+\\s*1(-?|\\s+))*[0-9]{3}\\s*-?\\s*[0-9]{3}\\s*-?\\s*[0-9]{4}$" 

Valide un numéro de téléphone sous la forme de: +1-xxx-xxx-xxxx , y compris les espaces de début et de fin facultatifs au début / à la fin de chaque groupe de chiffres, mais pas au milieu, par exemple: +1-xxx-xxx-xx xx n'est pas valide. Le - delimiter peut être remplacé par des blancs: xxx xxx xxx ou sans delimiter: xxxxxxxxxx . Le préfixe +1 est facultatif.

Vérifions ça:

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")

Cas valides:

> grepl(us.phones.regex, phones.OK)
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE
> 

Cas non valides:

 > grepl(us.phones.regex, phones.NOK)
[1] FALSE FALSE FALSE FALSE FALSE
> 

Note :

  • \\s Correspond à n'importe quel caractère d'espace, de tabulation ou de nouvelle ligne

Échappement de caractères dans les motifs de regex R

Etant donné que R et regex partagent le caractère d'échappement, "\" , la création de modèles corrects pour grep , sub , gsub ou toute autre fonction qui accepte un argument de modèle nécessitera souvent l'association de barres obliques inverses. Si vous construisez un vecteur de caractère à trois éléments dans lequel un élément a un saut de ligne, un autre un caractère de tabulation et un autre, et que le souhait est de transformer le saut de ligne ou l’onglet en 4 espaces, une seule barre oblique mais antislashs assortis pour faire correspondre:

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"

Notez que l'argument pattern (qui est facultatif s'il apparaît en premier et n'a besoin que d'une orthographe partielle) est le seul argument pour exiger ce doublage ou cet appariement. L'argument de remplacement ne nécessite pas le doublement des caractères à échapper. Si vous vouliez que tous les sauts de ligne et les occurrences à 4 espaces remplacent les tabulations, ce serait:

gsub("\\n|    ", "\t", x)
#[1] "a\tb" "c\td" "e\tf"

Différences entre Perl et POSIX regex

Il y a deux moteurs d'expressions régulières à peu près différents implémentés dans R. La valeur par défaut est POSIX. toutes les fonctions regex dans R sont également équipées d'une option permettant d'activer ce dernier type: perl = TRUE .

Look-ahead / look-behind

perl = TRUE active la recherche anticipée et la recherche dans les expressions régulières.

  • "(?<=A)B" correspond à une apparence de la lettre B que si elle est précédée de A , c'est-à-dire que "ABACADABRA" correspondrait, mais pas "abacadabra" et "aBacadabra" .


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow