Accéder au contenu principal

Guide des expressions régulières en R

Découvrez les expressions régulières dans R, pourquoi elles sont importantes, les outils et les fonctions pour travailler avec elles, les modèles de regex les plus courants et comment les utiliser.
Actualisé 14 nov. 2024  · 16 min de lecture

Le concept d'expressions régulières, généralement appelé regex, existe dans de nombreux langages de programmation, tels que R, Python, C, C++, Perl, Java et JavaScript. Vous pouvez accéder à la fonctionnalité des expressions rationnelles soit dans la version de base de ces langages, soit par l'intermédiaire de bibliothèques. Pour la plupart des langages de programmation, la syntaxe des motifs d'expressions rationnelles est similaire.

Dans ce tutoriel, nous allons explorer ce que sont les expressions régulières dans R, pourquoi elles sont importantes, quels outils et fonctions nous permettent de travailler avec elles, quels motifs d'expressions régulières sont les plus courants, et comment les utiliser. Enfin, nous passerons en revue quelques applications avancées de R regex.

Que sont les R Regex et pourquoi les utiliser ?

Une expression régulière, regex, en R est une séquence de caractères (ou même un seul caractère) qui décrit un certain modèle trouvé dans un texte. Les modèles de regex peuvent être aussi courts que "a" ou aussi longs que celui mentionné dans ce fil de discussion StackOverflow.

D'une manière générale, la définition ci-dessus de la regex s'applique non seulement à R mais aussi à tout autre langage de programmation prenant en charge les expressions régulières.

Regex est un outil très flexible et puissant, largement utilisé pour le traitement et l'exploration de données textuelles non structurées. Par exemple, ils trouvent leur application dans les moteurs de recherche, l'analyse lexicale, le filtrage des spams et les éditeurs de texte.

Outils et fonctions pour travailler avec R Regex

Si les modèles de regex sont similaires pour la majorité des langages de programmation, les fonctions permettant de les utiliser sont différentes.

Dans R, nous pouvons utiliser les fonctions de la base R pour détecter, faire correspondre, localiser, extraire et remplacer les expressions rationnelles. Vous trouverez ci-dessous les principales fonctions qui recherchent les correspondances d'une expression rationnelle dans un vecteur de caractères et qui effectuent les opérations suivantes :

  • grep(), grepl() - renvoie les indices des chaînes contenant une correspondance (grep()) ou un vecteur logique indiquant les chaînes contenant une correspondance (grepl()).
  • regexpr(), gregexpr() - renvoient l'index de chaque chaîne où la correspondance commence et la longueur de cette correspondance. Alors que regexpr() ne fournit cette information que pour la première correspondance (à partir de la gauche), gregexpr() fait de même pour toutes les correspondances.
  • sub(), gsub() - remplace une correspondance détectée dans chaque chaîne par une chaîne spécifiée (sub() - uniquement pour la première correspondance, gsub() - pour toutes les correspondances).
  • regexec() - fonctionne comme regexpr() mais renvoie les mêmes informations pour une sous-expression spécifiée à l'intérieur de la correspondance.
  • regmatches() - fonctionne comme regexec() mais renvoie les chaînes exactes détectées pour la correspondance globale et une sous-expression spécifiée.

Cependant, au lieu d'utiliser les fonctions natives de R, une manière plus pratique et plus cohérente de travailler avec les expressions rationnelles de R est d'utiliser le paquetage spécialisé stringr de la collection tidyverse. Cette bibliothèque est construite sur le paquetage stringi. Dans la bibliothèque stringr, toutes les fonctions commencent par str_ et ont des noms beaucoup plus intuitifs (ainsi que les noms de leurs paramètres optionnels) que ceux de la base R.

Pour installer et charger le paquetage stringr, exécutez la commande suivante :

install.packages('stringr')
library(stringr)

Le tableau ci-dessous montre la correspondance entre les fonctions de stringr et celles de la base R dont nous avons parlé plus haut dans cette section :

stringr

Base R

str_subset()

grep()

str_detect()

grepl()

str_extract()

regexpr(), regmatches(), grep()

str_match()

regexec()

str_locate()

regexpr()

str_locate_all()

gregexpr()

str_replace()

sub()

str_replace_all()

gsub()

Vous trouverez une liste complète des fonctions stringr et des expressions régulières dans ces antisèches, mais nous aborderons certaines d'entre elles plus en détail dans ce tutoriel.

Remarque: dans les fonctions stringr, nous passons d'abord les données, puis une expression rationnelle, alors que dans les fonctions R de base, c'est exactement le contraire.

R Motifs d'expressions rationnelles

Nous allons maintenant passer en revue les modèles de regex R les plus populaires et leur utilisation, tout en mettant en pratique certaines des fonctions stringr.

Avant cela, prenons un exemple très simple. A savoir, vérifions si une licorne a au moins un maïs 😉

str_detect('unicorn', 'corn')

Sortie :

TRUE

Dans cet exemple, nous avons utilisé la fonction str_detect() stringr pour vérifier la présence de la chaîne corn dans la chaîne unicorn.

Cependant, en général, nous ne recherchons pas une chaîne de caractères littérale dans un texte, mais plutôt un certain motif - une expression régulière. Plongeons dans l'exploration de ces modèles.

Échappées de personnages

Certains caractères ont une signification particulière lorsqu'ils sont utilisés dans des expressions régulières R. Plus précisément, ils ne se correspondent pas entre eux, comme le font toutes les lettres et tous les chiffres, mais ils font quelque chose de différent :

str_extract_all('unicorn', '.')

Sortie :

1. 'u' 'n' 'i' 'c' 'o' 'r' 'n'

Nous voyons clairement qu'il n'y a pas de points dans notre licorne. Cependant, la fonction str_extract_all() a extrait tous les caractères de cette chaîne. Il s'agit de la mission exacte du caractère . - qui correspond à n'importe quel caractère unique, à l'exception d'une nouvelle ligne.

Que faire si nous voulons extraire un point littéral ? Pour ce faire, nous devons utiliser un caractère d'échappement regex avant le point - une barre oblique inverse (\). Cependant, il faut garder à l'esprit un piège : la barre oblique inverse est également utilisée dans les chaînes elles-mêmes comme caractère d'échappement. Cela signifie que nous devons d'abord "échapper au caractère d'échappement" en utilisant une double barre oblique inverse. Voyons comment cela fonctionne :

str_extract_all('Eat. Pray. Love.', '\\.')

Sortie :

1. '.' '.' '.'

La barre oblique inverse permet donc de négliger la signification particulière de certains symboles dans les expressions régulières R et de les interpréter littéralement. Il a également la mission inverse : donner un sens particulier à certains caractères qui, autrement, seraient interprétés littéralement. Vous trouverez ci-dessous un tableau des séquences d'échappement de caractères les plus utilisées :

R regex

Quelles correspondances

\b

Une limite de mot (une limite entre un \W et un \W)

\B

Une frontière sans mot(\w-\w ou \W-\W)

\n

Une nouvelle ligne

\t

Un onglet

\v

Un onglet vertical

Voyons quelques exemples en gardant à l'esprit que, dans ce cas également, nous devons utiliser une double barre oblique inverse. Parallèlement, nous introduirons deux autres fonctions stringr : str_view() et str_view_all() (pour afficher le rendu HTML de la première correspondance ou de toutes les correspondances) :

str_view('Unicorns are so cute!', 's\\b')
str_view('Unicorns are so cute!', 's\\B')

Sortie :

Les licornes sont si mignonnes !

Les licornes sont simignonnes !

Dans la chaîne Les licornes sont si mignonnes, il y a deux occurrences de la lettre s. Ci-dessus, le premier motif regex R a mis en évidence la première occurrence de la lettre s (puisqu'elle est suivie d'un espace), tandis que le second - la deuxième occurrence (puisqu'elle est suivie d'une autre lettre, et non d'une limite de mot).

Quelques exemples supplémentaires :

cat('Unicorns are\nso cute!')
str_view_all('Unicorns are\nso cute!', '\\n')

Sortie :

Unicorns are
so cute!

Les licornes sontsi mignonnes !

cat('Unicorns are\tso cute!')
str_view_all('Unicorns are\tso cute!', '\\t')

Sortie :

Unicorns are so    cute!

Les licornes sontsi mignonnes !

Classes de personnages

Une classe de caractères correspond à n'importe quel caractère d'un ensemble prédéfini de caractères. Les classes de caractères intégrées ont la même syntaxe que les séquences d'échappement de caractères que nous avons vues dans la section précédente : une barre oblique inverse suivie d'une lettre à laquelle elle donne une signification spéciale plutôt que sa signification littérale. Les constructions les plus courantes sont présentées ci-dessous :

R regex

Quelles correspondances

\w

Tout caractère de mot (lettre, chiffre ou trait de soulignement)

\W

Tout caractère autre qu'un mot

\d

N'importe quel chiffre

\D

Tout autre chiffre

\s

Tout caractère d'espacement (espace, tabulation, nouvelle ligne, etc.)

\S

Tout caractère autre qu'un espace

Prenons quelques exemples qui se passent d'explications :

str_view_all('Unicorns are so cute!', '\\w')
str_view_all('Unicorns are so cute!', '\\W')

Sortie :

Les licornes sont si mignonnes!

Les licornes sont si mignonnes!

str_view_all('Unicorns are\nso cute!', '\\s')
str_view_all('Unicorns are\nso cute!', '\\S')

Sortie :

Les licornes sont si mignonnes!

Les licornes sont si mignonnes !

str_detect('Unicorns are so cute!', '\\d')

Sortie :

FALSE

Les classes de caractères intégrées peuvent également apparaître sous une autre forme - [:nom_de_la_classe_de_caractère :]. Certaines de ces classes de caractères ont un équivalent parmi celles qui comportent une barre oblique inverse, d'autres non. Les plus courantes sont les suivantes :

R regex

Quelles correspondances

[:alpha :]

Toute lettre

[:lower:]

Toute lettre minuscule

[:upper:]

Toute lettre majuscule

[:digit :]

N'importe quel chiffre (équivalent à \d)

[:alnum :]

Toute lettre ou tout chiffre

[:xdigit :]

Tout chiffre hexadécimal

[:punct :]

Tout caractère de ponctuation

[:graph:]

Toute lettre, tout chiffre ou tout caractère de ponctuation

[:espace :]

Un espace, une tabulation, une nouvelle ligne, etc. (équivalent à \s)

Explorons quelques exemples en gardant à l'esprit que nous devons mettre entre crochets n'importe lequel des motifs R regex ci-dessus :

str_view('Unicorns are so cute!', '[[:upper:]]')
str_view('Unicorns are so cute!', '[[:lower:]]')

Sortie :

Les licornessont si mignonnes !

Leslicornessont si mignonnes !

str_detect('Unicorns are so cute!', '[[:digit:]]')

Sortie :

FALSE
str_extract_all('Unicorns are so cute!', '[[:punct:]]')

Sortie :

1. '!'
str_view_all('Unicorns are so cute!', '[[:space:]]')

Sortie :

Les licornes sont si mignonnes!

Il est également possible de créer une classe de caractères définie par l'utilisateur, en plaçant entre crochets un ensemble de caractères à partir desquels nous voulons faire correspondre un caractère donné. On peut mettre entre crochets une plage de lettres ou de chiffres (dans l'ordre Unicode), plusieurs plages différentes, ou tout ensemble séquentiel ou non séquentiel de caractères ou de groupes de caractères.

Par exemple, [A-D] correspondra à toute lettre majuscule de A à D inclus, [k-r] à toute lettre minuscule de k à r inclus,[0-7] à tout chiffre de 0 à 7 inclus, et [aou14%9] à tout caractère indiqué entre crochets. Si nous plaçons le caret (^) comme premier caractère à l'intérieur des crochets, notre motif R regex correspondra à tout ce qui ne correspond pas aux caractères fournis. Notez que les mécanismes de correspondance ci-dessus sont sensibles à la casse.

str_view_all('Unicorns Are SOOO Cute!', '[O-V]')
str_view_all('Unicorns Are SOOO Cute!', '[^O-V]')

Sortie :

Les licornessont TELLEMENT mignonnes !

Les licornes sont TELLEMENT mignonnes !

str_view_all('3.14159265359', '[0-2]')

Sortie :

3.14159265359

str_view_all('The number pi is equal to 3.14159265359', '[n2e9&]')

Sortie :

Lenombrepi est égal à3,14159265359

Quantificateurs

Souvent, nous devons faire correspondre un certain motif R regex de manière répétitive, au lieu d'une seule fois. À cette fin, nous utilisons des quantificateurs. Un quantificateur est toujours placé après le motif de la regex auquel il est lié. Les quantificateurs les plus courants sont présentés dans le tableau ci-dessous :

R regex

Nombre de répétitions du motif

*

0 ou plus

+

au moins 1

?

au maximum 1

{n}

exactement n

{n,}

au moins n

{n,m}

au moins n et au plus m

Essayons-les tous :

str_extract('dog', 'dog\\d*')

Sortie :

'dog'

Nous avons obtenu le chien de la chaîne initiale : il n'y a pas de chiffres à la fin de cette chaîne, mais nous sommes d'accord avec cela (0 ou plusieurs occurrences de chiffres).

str_extract('12345', '\\d+')

Sortie :

'12345'
str_extract('12345', '\\d?')

Sortie :

'1'
str_extract('12345', '\\d{3}')

Sortie :

'123'
str_extract('12345', '\\d{7,}')

Sortie :

NA

Nous avons obtenu NA parce que nous n'avons pas au moins 7 chiffres dans la chaîne, seulement 5 d'entre eux.

str_extract('12345', '\\d{2,4}')

Sortie :

'1234'

Ancres

Par défaut, les expressions rationnelles correspondent à n'importe quelle partie d'une chaîne fournie. Nous pouvons modifier ce comportement en spécifiant une certaine position d'un motif R regex à l'intérieur de la chaîne. Le plus souvent, nous souhaitons imposer la correspondance à partir du début ou de la fin de la chaîne. À cette fin, nous utilisons les deux principaux points d'ancrage des expressions régulières de R :

  • ^ - recherche à partir du début de la chaîne (pour les chaînes multilignes - le début de chaque ligne)
  • $ - correspond à la fin de la chaîne (pour les chaînes multilignes - la fin de chaque ligne)

Voyons comment ils fonctionnent sur l'exemple d'un palindrome stella won no wallets:

str_view('stella won no wallets', '^s')
str_view('stella won no wallets', 's$')

Sortie :

stellan'a pas gagné de portefeuilles

stella n'a pas gagné de portefeuilles

Si nous voulons faire correspondre les caractères ^ ou $ eux-mêmes, nous devons faire précéder le caractère en question d'une barre oblique inverse(qui le double) :

str_view_all('Do not have 100$, have 100 friends', '\\$')

Sortie :

N'ayez pas 100$, ayez 100 amis

Il est également possible d'ancrer les correspondances à des limites de mots ou de non-mots à l'intérieur de la chaîne( respectivement\b et \B ) :

str_view_all('road cocoa oasis oak boa coach', '\\boa')
str_view_all('road cocoa oasis oak boa coach', 'oa\\b')
str_view_all('road cocoa oasis oak boa coach', 'oa\\B')

Sortie :

road cocoa oasis oakboa coach

road cocoa oasis oakboa coach

roadcocoa oasis oakboacoach

Ci-dessus, nous avons fait correspondre la combinaison de lettres oa :

  • 1er exemple - au début des mots
  • 2ème exemple - à la fin des mots
  • 3ème exemple - lorsqu'il est suivi d'un caractère verbal (dans notre cas - d'une lettre)

Alternation

En appliquant l'opérateur d'alternance(|), nous pouvons faire correspondre plus d'un motif R regex dans la même chaîne. Notez que si vous utilisez cet opérateur dans le cadre d'une classe de caractères définie par l'utilisateur, il est interprété littéralement et n'effectue donc aucune alternance.

str_view_all('coach koala board oak cocoa road boa load coat oasis boat', 'boa|coa')

Sortie :

coachkoala boardoakcocoa road boa load coatoasis boat

Dans l'exemple ci-dessus, nous avons fait correspondre toutes les occurrences de boa ou de coa.

Regroupement

Les motifs d'expressions rationnelles suivent certaines règles de priorité. Par exemple, la répétition (à l'aide de quantificateurs) a la priorité sur l'ancrage, tandis que l'ancrage a la priorité sur l'alternance. Pour passer outre ces règles et augmenter la priorité d'une certaine opération, nous devons utiliser le regroupement. Pour ce faire, il suffit de placer une sous-expression entre crochets ronds.

Le regroupement fonctionne mieux en combinaison avec l'opérateur d'alternance. Les exemples ci-dessous illustrent clairement l'effet d'une telle combinaison :

str_view_all('code rat coat cot cat', 'co|at')
str_view_all('code rat coat cot cat', 'c(o|a)t')

Sortie :

coderat manteau litchat

code rat manteau lit chat

Applications avancées des expressions régulières R

Tout ce que nous avons abordé jusqu'à présent nous donne une bonne base pour commencer à travailler avec les expressions régulières R. Cependant, nous pouvons faire bien d'autres choses avec cet outil puissant. Sans entrer dans les détails, mentionnons simplement quelques opérations avancées que nous pouvons effectuer avec R regex :

  • Remplacer les valeurs par défaut des fonctions stringr
  • Correspondance entre les groupes de graphèmes
  • Référencement en groupe
  • Correspondance des propriétés Unicode
  • Application de l'échappement avancé des caractères
  • Vérifier l'existence d'un motif sans l'inclure dans la sortie (ce que l'on appelle les solutions de contournement)
  • Rendre le mécanisme de répétition des motifs plus paresseux que gourmand
  • Travailler avec des groupes atomiques

Apprenez-en plus dans notre cours Expressions régulières intermédiaires dans R.

Défi R Regex

C'est maintenant à vous de mettre en pratique les modèles de regex R que nous avons abordés dans ce tutoriel. Pour ce faire, utilisez notre base de données : Internet News and Consumer Engagement, et essayez de faire ce qui suit : extraire les domaines de premier niveau (TLD) de tous les URL. Voici quelques exemples de TLD : com, net, uk, etc.

Il existe plusieurs approches pour accomplir cette tâche, y compris des solutions élégantes et compactes en une ligne (astuce : vous pouvez en apprendre davantage sur les solutions de contournement dans les expressions rationnelles de R mentionnées dans la section précédente et les utiliser pour résoudre ce problème). Considérez les conseils suivants, très peu contraignants, pour une approche relativement "novice" :

  • Inspectez quelques URL dans l'ensemble de données et remarquez quels motifs sont toujours présents dans toute URL avant le TLD et lesquels sont facultatifs.
  • Notez s'il y a des motifs obligatoires dans les URL après le TLD (et si oui, lesquels) et quels motifs sont facultatifs.
  • Supprimez tout ce qui précède le TLD de l'URL
  • Supprimez tout ce qui se trouve après le TLD de l'URL

Pour résoudre le problème à l'aide de l'algorithme ci-dessus, vous n'avez pas besoin de faire ou d'apprendre quoi que ce soit de plus. Rafraîchissez tout ce que nous avons abordé dans ce tutoriel et mettez vos connaissances en pratique. Vous aurez notamment besoin des fonctions stringr, des échappements de caractères, des classes de caractères, des quantificateurs et des groupements.

Bonus : Défi n°2

Si vous souhaitez vous entraîner davantage, cette fois sans aucun indice, essayez de faire ce qui suit : en utilisant le même ensemble de données que pour le défi précédent, extrayez les noms de domaine de toutes les URL. Un exemple de nom de domaine est google dans l'URL www.google.com.

Conclusion

Pour conclure, dans ce tutoriel, nous avons appris beaucoup de choses sur les expressions régulières R. En particulier, nous avons discuté :

  • Ce que sont les regex en R
  • Pourquoi ils sont importants et où ils sont appliqués
  • Quelles sont les fonctions (provenant à la fois de la version native de R et d'une bibliothèque spécialisée) utilisées pour travailler avec les expressions régulières de R ?
  • Les motifs de regex les plus courants en R, leur portée, leurs nuances et leurs pièges
  • Quand et comment utiliser les échappements de caractères, les classes de caractères, les quantificateurs, les ancres, l'alternance et le regroupement avec les expressions rationnelles R.
  • Divers exemples d'application de regex et de fonctions R
  • Quelques opérations avancées avec les expressions régulières R

Ces compétences et notions vous aideront à travailler dans R et dans de nombreux autres langages de programmation puisque le concept des expressions régulières est le même pour tous ces langages et que la syntaxe des regex est également assez similaire pour la plupart d'entre eux.

Si vous souhaitez maîtriser vos compétences en R, pensez à explorer les cours, les pistes de compétences et les articles suivants de DataCamp :

Sujets

Les meilleurs cours de rhétorique

Certification disponible

cours

Intermédiaire R

6 hr
606K
Poursuivez votre parcours pour devenir un ninja de R en vous familiarisant avec les instructions conditionnelles, les boucles et les fonctions vectorielles.
Afficher les détailsRight Arrow
Commencer Le Cours
Voir plusRight Arrow