Cours 3 : Techniques de recherche avancées
<lgrobol@parisnanterre.fr>
Université Paris Nanterre
Permet de faire des requêtes dans Google Books :
Exemple : « vélocipède » vs « vélo » vs « bicyclette »
→ L’évolution des fréquences relatives des n-grammes dans le corpus
« the United States are » ou « the United States is »
*
Le token *
: remplace n’import quel mot.
Exemple : une colère *
donne les fréquences de trigrammes dont les deux premiers mots sont « une » et « colère »
Expressions régulières = ER = RegEx
Outils :
Possible, mais moins pratique pour ce cours :
clg.txt
.*
) et « respecter la casse » (ou Aa
)France 2
match France 2
, mais pas France2
ni France 3
Aa
) madeleine
match madeleine
, mais pas Madeleine
Ils portent sur l’élément qui précède et indiquent une répétition
Quantificateur | ? |
* |
+ |
---|---|---|---|
Signification | « 0 ou 1 fois » | « 0 ou plusieurs fois » | « 1 ou plusieurs fois » |
pl?eur
matche peur
et pleure
coup?s
matche cous
et coups
, mais pas coupa
jolie*
matche joli
, jolie
, joliee
, jolieee
…jolie+
matche jolie
, joliee
, jolieee
…Exercice : que matchent les expressions suivantes ?
a?typique
pomm?es
lo*l
loo*l
lol+
(Tester vos réponses dans un éditeur)
Caractère | Sens | Exemple |
---|---|---|
. |
n’importe quel caractère | p.re : pare , pire , père … |
^ |
début de ligne | ^Je (début de ligne) |
$ |
fin de ligne | informatique$ (fin de ligne) |
\n |
saut de ligne | a\n : a puis saut de ligne |
\t |
tabulation | a\t : a puis tabulation |
Exercices : à quoi correspondent ces expressions ?
Nom\tPrénom
cap$
br.n
^cap
premier paragraphe\ndeuxième paragraphe
On a vu un certain nombre de métacaractères (les caractères avec une signification spéciale).
Pour les matcher littéralement (les « déspécialiser »), il faut les faire précéder d’un anti-slash \
:
3\.0
matche 3.0
, mais pas 310
price: \$5
: matche price: $5
^
, [
, ]
, (
, )
, *
, +
, ?
, {
, }
Et pour représenter un anti-slash ? Pareil
machin\\truc
matche machin\truc
La barre droite |
indique une alternative :
machin|truc
matche machin
et truc
.je|tu|nous
matche je
, tu
et nous
.je|tu|[nv]ous
matche je
, tu
, nous
et vous
.On les utilise le plus souvent avec des parenthèses pour contrôler sa portée
(m|r)aison
matche maison
et raison
.(il|elle|iel)s?
matche il
, elle
, iel
et leurs versions plurielles.Les crochets indiquent un ensemble de caractères à matcher :
[abc]
matche un caractère qui est soit a
, soit b
, soit c
[a-r]
matche les lettres de a
à r
[a-z]
matche les lettres de l’alphabet en minuscules[a-zA-Z]
matche aussi les majuscules*Exercice :
Que matchent :
[ab][ab]
[MmRr]aison
Écrire une expression régulière qui matche exclusivement :
moi
, toi
et soi
.ci
, si
, ce
et se
.(Tester vos réponses dans un éditeur)
Avec un circonflexe au début : négation de l’ensemble
[^abc]
matche tout sauf a
, b
et c
[^0-9]
matche tout sauf des chiffres[^A-Z]
matche tout sauf des majuscules sans diacritiquesOn peut les combiner avec les quantificateurs :
[aeiouy]+
matche une suite de voyelles : a
, aa
, ae
, iey
…[^abc]*
matche une suite de caractères différents de a
, b
et c
.Les parenthèses permettent de construire des groupes
(ab)+
matche une suite de ab
: ab
, abab
, ababab
…([ab]c)+
matche ac
, bc
, acac
, acbc
, bcac
…([aeiouy][^aeiouy])+
matche une suite de couples voyelle—(non-voyelle).Exercice : que matchent les expressions suivantes ?
vert(es)?
(anti|pro)nucléaire
Wiki[a-z]+
Wiki[a-z]*
Dans le fichier clg.txt
, combien trouvez-vous de matchs pour chacun des expressions régulières suivantes ? Que signifient-elles ?
.évolution
.[a-zA-Z]évolution
[^rR]évolution
Les accolades indiquent un intervalle de répétitions :
lo{1,3}ng
matche long, loong et looonglo{3,}
matche looong, loooong, etc.lo{3}ng
ne matche que looongExercice : écrire une expression régulière qui reconnaît exclusivement lool
, loool
et looool
.
Classe | Signification | Équivalent ASCII |
---|---|---|
\d |
un chiffre | [0-9] |
\D |
tout sauf un chiffre | [^0-9] |
\w |
les caractères alphanumériques et _ | [a-zA-Z0-9âàéèêëôûüù_] |
\W |
tout sauf les caractères alphanumériques et _ | [^a-zA-Z0-9âàéèêëôûüù_] |
\s |
une espace | espace, \t , \n … |
\S |
tout sauf une espace | … |
\b |
frontière de mot (début ou fin de mot) | \bjour : journée mais pas ajouré |
Notes :
\X
reconnaît le contraire de \x
\w
, \s
et \b
peut varier suivant les moteurs de regex, suivant leur support d’Unicode. En particulier ils marchent mal dans VSCode.Classe | Signification |
---|---|
\p{L} |
une lettre |
\P{L} |
tout sauf une lettre |
\p{P} |
Une ponctuation |
\P{P} |
tout sauf une ponctuation |
\p{Lu} |
une lettre majuscule |
\p{Ll} |
une lettre minuscule |
Voir les détails sur MDN et la liste des propriétés du type « catégories générales » (≈ classes de caractères) du consortium Unicode.
Dans `clg.txt, combien y-a-t-il de mots :
r
?r
?a
et finissant par er
?er
en fin de ligne ?Faire les niveaux suivants sur https://alf.nu/RegexGolf
Faire le tutoriel et les 5 premiers puzzles de https://regexcrossword.com
Au tableau ! Voir aussi https://cyberzhg.github.io/toolbox/nfa2dfa
?
après un quantificateur, on le rend lazy : il matche le minimum de caractères.Par exemple, si l’entrée est AHHHHHHHHH
:
AH+
matche la plus longue suite de caractères : AHHHHHHHHH
AH+?
matche la plus petite suite de caractères : AH
On peut utiliser des références numérotées pour rappeler le contenu d’un groupe :
(spam|egg), sausage and \1
reconnaît :
spam, sausage and spam
egg, sausage and egg
egg, sausage and spam