https://data.hypotheses.org/959 l'original
Menu
15 réponses
Les expressions régulières sont un outil extrêmement utile pour réaliser des opérations
complexes de recherche-remplacer sur des grandes quantités de texte, qui nous semble
d’intérêt général pour tous les chercheurs en sciences sociales. On en présente ici le principe,
la syntaxe et comment les utiliser concrètement.
Nous passons notre temps, en sciences sociales, à manipuler des données textuelles :
réponses ouvertes à un questionnaire, noms de personnes, lieux, caractéristiques sociales,
mais aussi articles de presse, correspondances, transcriptions d’entretiens, jusqu’aux textes
scientifiques que nous produisons. Or, pour traiter de telles données avec un ordinateur, il est
fréquent de devoir effectuer des transformations systématiques, à des fins qui vont d’un
nettoyage avant importation pour une analyse statistique, jusqu’à une conformation à des
normes typographiques avant publication.
Parmi les outils que nous utilisons couramment, certains permettent d’effectuer de telles
modifications, en particulier R et OpenOffice/LibreOffice ou Word. Chacun a déjà utilisé les
fonctions de recherche et de “rechercher-remplacer” de Word ou équivalent. On présente ici une
généralisation de ces fonctions qui permet d’automatiser rapidement presque toutes les
opérations textuelles imaginables. Pour les utiliser, il suffit d’un langage de programmation
(par exemple R, Python, etc.) ou d’un bon éditeur de texte. Parmi les logiciels de traitement de
texte, LibreOffice et OpenOffice permettent de faire la même chose ; c’est le cas aussi de Word
(mais avec une syntaxe assez différente, qu’on n’évoquera pas ici).
Nous avons donc sous la main des logiciels dotés de fonctions à même de nous épargner des
heures de travail fastidieux, mais bien souvent nous ne savons pas les utiliser, ou nous ne
savons même pas qu’elles existent.
Le sujet peut paraître compliqué au premier abord, et si vous regardez rapidement la suite de
ce billet, vous risquez de ne voir que des signes cabalistiques rebutants. Pas d’inquiétude
toutefois : les expressions régulières ne sont pas faites pour être lues, mais pour être faciles à
écrire.
Ce billet propose une introduction à ce sujet, afin de montrer la logique de cet outil, à la fois
très simple et puissant. Car le plus important n’est pas de connaitre les expressions régulières,
mais d’en comprendre le principe et savoir ce qu’il est possible de faire avec. Après quoi, il
existe de nombreuses aides que même les chercheurs expérimentés consultent souvent.
Supposons que, pour les individus d’une population dont on veut faire une prosopographie, on
ait saisi une liste de dates et lieux de naissance dans un fichier texte (ou un vecteur de type
charactersous R) – ici des membres des Francs Tireurs et partisans (FTP) :
Comment transformer cette série de lignes de texte, dont la structure est toujours la même, en
une autre série de lignes de texte, chacune comportant uniquement l’année de naissance ? Si
on sait réaliser cette opération, alors on pourra faire de même pour le département et les
autres données qui nous intéressent, et transformer ce texte en base de données prête pour
l’analyse. Concentrons-nous donc sur l’année.
À conceptualiser, l’opération est très simple. Il suffit, dans chaque ligne, de rechercher l’année,
de la mémoriser, puis de remplacer le contenu de la ligne par elle. Comment repérer l’année ? À
l’œil nu, rien de plus facile : c’est le nombre composé de quatre chiffres. On pourrait aussi
remarquer qu’elle ici est le deuxième nombre de chaque ligne, ou encore le premier nombre qui
soit suivi immédiatement d’une virgule, etc. Toutes ces désignations de formes textuelles sont
ce qu’on appelle des motifs (patterns, en anglais).
Le travail est donc très simple à penser. Mais s’il doit être répété sur un grand nombre de
lignes, c’est fastidieux. Certains vont donc employer un esclave doctorant, mais un programme
informatique de quelques lignes le fait aussi bien. Et le travail de programmation qui peut
paraître compliqué au premier abord est en réalité très simple à écrire, au point que c’est une
solution plus rapide (et même plus sûre) que de recopier manuellement les informations qui
vous intéressent, et ce dès que vous avez plus que quelques lignes[1].
La syntaxe qui permet de traduire les instructions précédentes pour l’ordinateur, d’indiquer les
motifs qu’on désire repérer, est appelée expressions régulières, en anglais regular expressions,
souvent abbrevié en regex[2]. Il en existe plusieurs variantes. R utilise une syntaxe très
puissante et très répandue, appelée PCRE ou parfois “de type perl”[3], comme à peu près tous
les langages de programmation généralistes.
Bases de la syntaxe
Les expressions régulières sont donc une syntaxe pour décrire de manière assez naturelle des
formes textuelles à un ordinateur. Cela n’a rien d’évident a priori, mais on va voir comment
désigner des fragments de formes comme “n’importe quoi”, “quatre chiffres exactement”, “au
moins une majuscule”, etc. La syntaxe comportera, inévitablement, des symboles un peu
cabalistiques, mais il ceux-ci ne sont pas nombreux, et l’important est qu’ils se combinent
comme du Lego.
La syntaxe des expressions régulières se compose de deux types d’éléments : des groupes de
caractères (par exemple : les chiffres, les lettres, les espaces, mais aussi des groupes que l’on
peut définir soi-même, comme les lettres aet c, les chiffres de 0 à 7…)[4], et des quantificateurs
(par exemple : un, deux, zéro ou un, un ou plus, entre 4 et 7, un nombre quelconque, etc.). On
utilise ici cette convention graphique : gras pour les groupes de caractères, italique pour les
quantificateurs.
Une expression régulière est ainsi une suite de groupe de caractères, chacun accompagné
d’un quantificateur. Par exemple : un certain nombre delettres, au moins un espace, exactement
quatrechiffres.
Les groupes de caractères les plus courants sont les suivants (en PCRE) :
\w : les lettres (w pour word)
\d : les chiffres (d pour digit)
\s : les espaces (s pour spaces)
[A-Z] : les majuscules
[abd;_] : les lettres a, b, et d, le point-virgule (;), et l’underscore (_)
. : n’importe quel caractère (excepté le saut de ligne)
k : la lettre k
(k|\d{2}) : la lettre k, ou bien deux chiffres
Une absence de quantificateur désigne une et une seule occurrence. Ainsi, le motif abc
correspond à una, puis un b, puis un c, soit exactement le texte abc, comme d’habitude.
Avec ces bases, on peut déjà aller très loin. Revenons à l’exemple des FTP : on peut
maintenant écrire le motif correspondant à quatre chiffres : \d{4} (ou \d\d\d\d, c’est la même
chose).
Les expressions régulières servent à repérer des morceaux de texte correspondant à un motif
que l’on écrit de façon formelle. Mais si on veut réutiliser ces morceaux de texte, il faut pouvoir
les mettre en mémoire, et ensuite accéder au contenu de cette mémoire.
Pour cela, la syntaxe consiste à entourer ce qu’on veut mettre en mémoire de parenthèses.
Ainsi, pour chercher et mettre en mémoire quatre chiffres, on écrira l’expression régulière
(\d{4}).
Une fois appliqué cette expression régulière à une chaîne de caractères, le premier élément
correspondant (ici le premier nombre à quatre chiffres trouvé) est stocké dans la variable \1
(ou parfois $1).
Ainsi, pour extraire l’année de né le 3 juillet 1897, à Rennes (35), on écrira : si tu trouves
le motif (\d{4})dans cette chaîne de caractères, renvoie-moi \1.
Caractères spéciaux
Vous aurez remarqué qu’on utilise certains caractères pour écrire les expressions régulières : \
{ } ( ) [ ] . + ? - *, etc. Comment écrire pour dire qu’on veut identifier de tels caractères
dans un texte, qui pourrait en contenir ?
Pour cela, on les fait simplement précéder de \, pour signaler qu’il ne faut pas les considérer
comme caractères spéciaux, mais comme caractères réels. Ainsi, pour trouver un +dans un
texte, on écrira dans l’expression régulière \+.
Il existe également d’autres caractères spéciaux, qu’on ne peut pas écrire normalement avec
les touches du clavier. Il s’agit des espaces comme les sauts de ligne, de page, les tabulations
; ils s’écrivent comme suit, respectivement : \n, \f, \t.
Enfin, deux caractères spéciaux très commodes indique le début et la fin de la ligne : ^et $,
quand ils sont placés au début et à la fin de la regex. Ils s’écrivent aussi, respectivement, \Aet
\Z.
Ainsi, une ligne complète, contenant un nombre à quatre chiffres avec potentiellement des
choses avant, et potentiellement des choses après, peut s’écrire ainsi :
^.*(\d{4}).*$
Quels logiciels utiliser, pour faire des recherches ou du rechercher-remplacer ? On présente ici
deux solutions possibles : R et LibreOffice. Chacune utilise une variante de la syntaxe
présentée ici, mais les différences ne commencent à être visibles que dans les cas
compliqués, donc on peut les négliger.
On va effectuer maintenant la même opération avec ces deux outils, sur l’exemple du début :
sélectionner l’année dans une série de lignes de renseignements d’état-civil.
La première chose à savoir, pour écrire des expressions régulières en R, est qu’il faut doubler
tous les backslashes[5] : on n’écrit pas \dmais \\d.
Ensuite, admettons que nos lignes de texte soient représentées par un vecteur de type
character. Il est alors facile d’effectuer pour l’ensemble des éléments de ce vecteur une
opération de recherche des éléments qui correspondent à une regex, ou de recherche et
remplacement sur ces éléments.
La recherche utilise la fonction grep(regex, vecteur)– dont le nom signifie Globally search a
Regular Expression and Print. Plus précisément, pour s’assurer qu’elle emploie la syntaxe qu’on
a évoquée ici, il convient d’ajouter l’option perl = TRUE. Cela permet d’indiquer qu’on utilise la
syntaxe PCRE. Cette fonction renvoie les numéros de position dans le vecteur recherché des
éléments qui correspondent à la regex, ce qui est particulièrement utile pour sélectionner des
lignes d’un dataframe (par exemple, df[grep(regex, df$var), ]). Elle peut aussi renvoyer les
éléments eux-mêmes, avec l’option value = TRUE. Enfin la fonction grepl(regex, vecteur)–
ne me demandez pas ce que signifie le l – renvoie TRUEou FALSEpour chaque élément du
vecteur, selon qu’il corresponde à la regex.
La première ligne crée un vecteur avec cinq arguments. La deuxième nous indique que la
chaine de caractère demandée (4 chiffres à la suite) est présente dans les lignes 1, 2, 3, 4 et 5;
et la troisième nous retourne les chaines en question grâce à l’option value = TRUE. La
quatrième montre que la chaine de caractère 6 chiffres d’affilée n’est présente nulle part
(integer(0)). Enfin, la dernière teste si elle commence ("^) par néeet donc si la personne est
une femme.
À noter que dans ces deux fonctions on peut utiliser l’option ignore.case = TRUE, qui permet
de ne pas tenir compte de la casse des lettres et traîter de manière équivalente majuscules et
minuscules, ce qui peut être utile.
Ces fonctions font partie des outils de base en R. Il en existe d’autres, qui peuvent être plus
pratiques, dans des modules dédiés à la manipulation de texte.
stringr
stringi
Très complet pour travailler avec des caractères exotiques et de manière générale un excellent
outil pour traiter du texte en R, le module stringicomprend les fonctions
stri_detect_regex(vecteur, regex)et stri_replace_all_regex(vecteur, regex,
remplacement), ainsi que stri_extract_first_regex(vecteur, pattern)(et d’autres du
même type, comme stri_extract_all_regex(vecteur, pattern)). Il n’est pas nécessaire
d’indiquer que l’on utilise des regex de type perl, car c’est la syntaxe qu’il utilise par défaut[6].
Attention, ici les éléments mis en mémoire se rappellent avec $1, $2etc., plutôt que \\1, \\2,
etc., cf. deuxième des lignes suivantes :
Avec LibreOffice/OpenOffice
Nul besoin de passer par un logiciel de statistiques pour utiliser des expressions régulières.
LibreOffice et OpenOffice peuvent également effectuer des recherches et des remplacement
de cette manière. La syntaxe qu’ils utilisent est documentée en détail ici pour LibreOffice, là
pour OpenOffice, mais dans les deux cas les bases sont les mêmes que ce qu’on a présenté
ici.
Pour les utiliser, il faut aller dans le menu “Édition” et y choisir “Rechercher & Remplacer”; puis,
dans la fenêtre qui s’ouvre alors, cocher la case “Expressions régulières”. Les valeurs mises en
mémoire se retrouvent avec $1, $2, etc. Pour notre exemple, cela donne :
Rechercher/Remplacer sous LibreOffice
Et on obtient le même résultat qu’avec R.
Pour Word la fonction de recherche/remplacement avancée est basée sur une syntaxe assez
différente, appelée fréquemment wildcards. Elle est moins pratique sur certains aspects, mais
permet bien de décrire le formattage du texte (italique, gras, etc.) – voir la documentation ici.
Conclusion
Voilà, vous êtes maintenant équipé pour transformer le texte de départ en un tableau de
données ou un dataframe, avec les expressions régulières. Vous pouvez vous entraîner, par
exemple en R, à créer un dataframe dont les variables (colonnes) seraient l’année de
naissance, le mois de naissance, mais aussi le sexe, et le département voire le pays de
naissance, de chaque individu.
Dans des prochains billets, on verra comment traiter des cas plus complexes, en termes
d’éléments de syntaxe mais aussi d’outils logiciels pour aider à appréhender des regex
complexes.
2. Le terme français considéré plus correct, mais presque jamais employé, est celui
d’expressions rationnelles.
5. La raison en est qu’on écrit les regex sous la forme de chaînes de caractères, qui ont
une syntaxe pour écrire certains caractères spéciaux (proche de celle mentionnée ici
pour les caractères spéciaux des regex), que R interprète ensuite pour y lire la “vraie”
chaîne de caractères que l’on a voulu exprimer. Comme le backslash (\) est l’un de
ces caractères spéciaux, et qu’on écrit justement les caractères spéciaux en les
faisant précér eux-mêmes d’un backslash, la syntaxe pour communiquer un
backslash à R dans une chaîne de caractères est \\(i.e. "… \\ …"). Pour voir
comment R interprète les chaînes de caractères, on peut utiliser la fonction cat() :
essayer par exemple cat("\"), cat("\\"), cat("\d"), cat("\\d").
6. Plus précisément stringiest basé sur la syntaxe ICU, mais qui est très proche de
PCRE.
Alexandre Hobeika
Cette entrée a été publiée dans Billets le 16/03/2015 par Alexandre Hobeika.
Laurent P
02/01/2020 à 23:34
Bonjour,
merci pour cet article fort intéressant. Cependant, j’ai l’impression qu’il est impossible de
remplacer une lettre majuscule par une lettre minuscule. Je me trompe ?
Par exemple, si je mets ([A-Z]) dans Rechercher, et que j’utilise $1 pour remettre la même lettre
dans Remplacer, comment je peux lui dire que je veux que le $1 soit en minuscule ???
Merci bien !
Répondre ↓
05/01/2020 à 23:03
Bonjour, et merci de votre message,
En syntaxe PCRE, il est possible de faire en sorte que tout ou partie du remplacement soit en
lettre majuscules ou minuscules. Pour exprimer ce que vous souhaitez, vous disposez des
balises \L, \Uet \E(respectivement \\L, \\Uet \\Een R). Après \Lles caractères seront mis en
minuscules (\L= lowercase, minuscules), après \Ules caractères seront mis en majuscule (\U
= uppercase, majuscules), et ce jusqu’à ce que soit rencontré un \Equi indique la fin d’une telle
procédure (\E= end, fin).
Pour le cas que vous mentionnez, pour que $1soit en lettre(s) minuscule(s) vous pouvez
indiquer \L$1\E(ou \\L\\1\\Een R).
Bien à vous,
Alexandre
Répondre ↓
JF Lille
06/12/2017 à 16:08
Bonjour. Cette technique me semble très puissante. Cependant, je n’ai qu’une toute petite
experience dans la manipulation des expressions régulières et je bloque sur le problème
suivant : Je souhaiterais récrire des textes en ne conservant que la première lettre de chaque
mot et la punctuation. Ex: Les expressions régulières sont un outil extrêmement utile pour
réaliser des opérations complexes. –> L e r s u o e u p r d o c.
Quelle-serait d’après vous l’approche la plus simple ?
Merci pour votre aide.
Répondre ↓
Vincent
15/02/2017 à 20:04
très intéressant !
Petite bouteille à la mer cependant : j’ai une regex « ^[^\\]*\\n([^\\]+).* » marche très bien sur
regex101 mais je n’arrive pas à la retranscrire pour qu’elle fonctionne dans R :(((
Répondre ↓
15/02/2017 à 21:14
Bonjour,
Si vous essayez avec [^\\\\]à la place de [^\\], est-ce que ça fonctionne ?
Sinon n’hésitez pas à donner une ou deux lignes auxquelles vous voulez appliquer la regex.
Répondre ↓
Vincent
15/02/2017 à 21:58
Répondre ↓
rastafia
15/08/2017 à 16:20
Répondre ↓
Antoine
29/09/2015 à 14:33
Super billet,
merci beaucoup!
Répondre ↓
Ping : Notice technique, illustrée par la communication officielle du Front national | Polit'bistro :
des politiques, du café
Ping : Notice technique, illustrée par la communication officielle du Front national | Polit’bistro :
des politiques, du café
étienne
05/04/2015 à 17:53
Merci Alex pour ce billet aussi riche et clair à la fois. Peux tu préciser ce que fait l’option
perl=T, que tu évoques dans la partie « application sous R »?
Répondre ↓
Ping : [Zotero] Renommer ses documents avec la date *complète* | LASPIC | Carnet
Etienne
19/03/2015 à 19:26
Répondre ↓
Laisser un commentaire
Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec
*
Commentaire
Nom *
Adresse de messagerie *
Site web
Enregistrer mon nom, mon e-mail et mon site web dans le navigateur pour mon prochain
commentaire.
Laisser un commentaire
Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données
de vos commentaires sont utilisées.
BILLETS RÉCENTS
Après le déluge
Une alternative à Word : écrire en RMarkdown
Science XXL – Programme
Exploiter les donnée d’enquêtes ménages pour la recherche ou la décision publique : un guide et trois
billets
Turkey plot
CALENDRIER
novembre 2020
L M M J V S D
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
« Mar
ÉTIQUETTES
Accents actualités Analyse de réseaux archives bibliométrie big data CAD collecte Culte Data datingdonnées
numériques encodage genre histoire HTML INAinfidélité interactions en ligne internet islam
Metrooscope open data outils privacy Quanti R RCurlreal time bidding regex revuessciences
sociales Sectes sex sites de rencontre social sciences sociologietechnique tutoriel twitter
télévision virgules web wikipedia études
Un carnet de recherche proposé par Hypothèses - Ce carnet dans le catalogue d'OpenEdition - Politique de
confidentialité
Flux de syndication - Crédits - ISSN: 2265-2515
Fièrement propulsé par WordPress
Ce site utilise des cookies et collecte des informations personnelles vous concernant.
Pour plus de précisions, nous vous invitons à consulter notre politique de confidentialité
(mise à jour le 25 juin 2018).
En poursuivant votre navigation, vous acceptez l'utilisation des cookies.
Fermer
Aller au contenu Accueil
À propos