• Aucun résultat trouvé

Les Expressions R´eguli`eres (Regular Expressions - RegEx)

N/A
N/A
Protected

Academic year: 2022

Partager "Les Expressions R´eguli`eres (Regular Expressions - RegEx)"

Copied!
36
0
0

Texte intégral

(1)

Les Expressions R´ eguli` eres (Regular Expressions - RegEx)

Eric BERTHOMIER

eric.berthomier@free.fr

27 janvier 2016

Ce cours est une adaptation libre de ”Regular Expressions in Python” ´ecrit par John R Woodward.

(2)

D´ efinition d’une expression r´ eguli` ere

Regular expression : (abbreviated regex or regexp) une s´equence de recherche permettant de r´ealiser des op´erations de type ’chercher et remplacer’ sur les chaˆınes de caract`eres (strings).

Chaque caract`ere dans une expression r´eguli`ere est soit interpr´et´e comme un m´eta-caract`ere (donc avec une signification s´epciale)

soit comme un caract`ere litt´eral

Le but des expressions r´eguli`eres est de savoir si une chaˆıne de caract`eres donn´ees correspond ou non `a une s´equence donn´ee (pattern).

Eric BERTHOMIER Les Expressions R´eguli`eres (Regular Expressions - RegEx)

(3)

D´ efinition d’une expression r´ eguli` ere

Regular expression : (abbreviated regex or regexp) une s´equence de recherche permettant de r´ealiser des op´erations de type ’chercher et remplacer’ sur les chaˆınes de caract`eres (strings).

Chaque caract`ere dans une expression r´eguli`ere est soit interpr´et´e comme un m´eta-caract`ere (donc avec une signification s´epciale)

soit comme un caract`ere litt´eral

Le but des expressions r´eguli`eres est de savoir si une chaˆıne de caract`eres donn´ees correspond ou non `a une s´equence donn´ee (pattern).

(4)

D´ efinition d’une expression r´ eguli` ere

Regular expression : (abbreviated regex or regexp) une s´equence de recherche permettant de r´ealiser des op´erations de type ’chercher et remplacer’ sur les chaˆınes de caract`eres (strings).

Chaque caract`ere dans une expression r´eguli`ere est soit interpr´et´e comme un m´eta-caract`ere (donc avec une signification s´epciale)

soit comme un caract`ere litt´eral

Le but des expressions r´eguli`eres est de savoir si une chaˆıne de caract`eres donn´ees correspond ou non `a une s´equence donn´ee (pattern).

Eric BERTHOMIER Les Expressions R´eguli`eres (Regular Expressions - RegEx)

(5)

Liste des m´ etacaract` eres

. +

?

*

^

$

[...]

[^...]

| () {m,n}

(6)

. (point)

Remplace n’importe quel caract`ere unique (1 caract`ere).

D´ependant des plateformes, le . peut ou non remplacer le caract`ere fin de ligne (0x0A / 0x0D)

Plac´e entre[ ] le point repr´esente alors un.

Il est aussi possible de prot´eger son interpr´etation par \.

Exemple d’utilisation de.

a.cpermettra de trouver la chaˆıne de caract`eres ”abc”, ”adc”, . . . maisne permetta pas de touver seulement ”a”, ”.”, ou ”c”.

Eric BERTHOMIER Les Expressions R´eguli`eres (Regular Expressions - RegEx)

(7)

. (point)

Remplace n’importe quel caract`ere unique (1 caract`ere).

D´ependant des plateformes, le . peut ou non remplacer le caract`ere fin de ligne (0x0A / 0x0D)

Plac´e entre[ ] le point repr´esente alors un.

Il est aussi possible de prot´eger son interpr´etation par \.

Exemple d’utilisation de.

a.cpermettra de trouver la chaˆıne de caract`eres ”abc”, ”adc”, . . . maisne permetta pas de touver seulement ”a”, ”.”, ou ”c”.

(8)

Exemple

regexHello.py

#!/usr/bin/python3

# -*- coding: UTF-8 -*-

importre

string1 ="Hello, world."

ifre.search(r"...", string1):

print("RegEx 1 : "+ string1 +" has length >= 5") ifre.search(r"....[.]", string1):

print("RegEx 2 : "+ string1 +" has length >= 5 and ends with a .") ifre.search(r"....\.", string1):

print("RegEx 3 : "+ string1 +" has length >= 5 and ends with a .")

regexHello.txt

RegEx 1 : Hello, world. has length >= 5

RegEx 2 : Hello, world. has length >= 5andends with a . RegEx 3 : Hello, world. has length >= 5andends with a .

Eric BERTHOMIER Les Expressions R´eguli`eres (Regular Expressions - RegEx)

(9)

+ (plus)

Teste si l’´el´ement qui le pr´ec`ede est pr´esent uneouplusieurs fois.

Exemple d’utilisation de+

ab+cvalidera les chaˆınes ”abc”, ”abbc”, ”abbbc”, et ainsi de suite mais ne validera pas ”ac”.

regexHelloPlus.py

#!/usr/bin/python3

# -*- coding: UTF-8 -*-

importre

string1 ="Hello, world." ifre.search(r"l+", string1):

print(string1 +" contient une ou plusieurs lettres l consecutives.")

regexHelloPlus.txt

Hello, world. contient une ou plusieurs lettres l consecutives.

(10)

+ (plus)

Teste si l’´el´ement qui le pr´ec`ede est pr´esent uneouplusieurs fois.

Exemple d’utilisation de+

ab+cvalidera les chaˆınes ”abc”, ”abbc”, ”abbbc”, et ainsi de suite mais ne validera pas ”ac”.

regexHelloPlus.py

#!/usr/bin/python3

# -*- coding: UTF-8 -*-

importre

string1 ="Hello, world." ifre.search(r"l+", string1):

print(string1 +" contient une ou plusieurs lettres l consecutives.")

regexHelloPlus.txt

Hello, world. contient une ou plusieurs lettres l consecutives.

Eric BERTHOMIER Les Expressions R´eguli`eres (Regular Expressions - RegEx)

(11)

+ (plus)

Teste si l’´el´ement qui le pr´ec`ede est pr´esent uneouplusieurs fois.

Exemple d’utilisation de+

ab+cvalidera les chaˆınes ”abc”, ”abbc”, ”abbbc”, et ainsi de suite mais ne validera pas ”ac”.

regexHelloPlus.py

#!/usr/bin/python3

# -*- coding: UTF-8 -*-

importre

string1 ="Hello, world."

ifre.search(r"l+", string1):

print(string1 +" contient une ou plusieurs lettres l consecutives.")

regexHelloPlus.txt

Hello, world. contient une ou plusieurs lettres l consecutives.

(12)

? (point d’interrogation)

Teste si l’´el´ement qui le pr´ec`ede est pr´esent z´eroou unefois.

regexHelloPi.py

#!/usr/bin/python3

# -*- coding: UTF-8 -*-

importre

string1 ="Hello, world." ifre.search(r"H.?e", string1):

print("Il y a un ’H’ et un ’e’ separe par 0-1 caracteres (Ex: HeHoe)")

regexHelloPi.txt

Il y a un’H’et un’e’separe par 0-1 caracteres (Ex: HeHoe)

Eric BERTHOMIER Les Expressions R´eguli`eres (Regular Expressions - RegEx)

(13)

? (point d’interrogation)

Teste si l’´el´ement qui le pr´ec`ede est pr´esent z´eroou unefois.

regexHelloPi.py

#!/usr/bin/python3

# -*- coding: UTF-8 -*-

importre

string1 ="Hello, world."

ifre.search(r"H.?e", string1):

print("Il y a un ’H’ et un ’e’ separe par 0-1 caracteres (Ex: HeHoe)")

regexHelloPi.txt

Il y a un’H’et un’e’separe par 0-1 caracteres (Ex: HeHoe)

(14)

* (´ etoile)

Teste si l’´el´ement qui le pr´ec`ede est pr´esent z´ero ouplusieurs fois.

Exemple d’utilisation de*

ab*c validera les chaˆınes ”ac”, ”abc”, ”abbbc” . . .

[xyz]*validera ””, ”x”, ”y”, ”z”, ”zx”, ”zyx”, ”xyzzy”, et ainsi de suite.

(ab)* validera ””, ”ab”, ”abab”, ”ababab” . . . regexHelloStar.py

#!/usr/bin/python3

# -*- coding: UTF-8 -*-

importre

string1 ="Hello, world." ifre.search(r"e(ll)*o", string1):

print("’e’ suivi de 0 ou plusieurs ’ll’ suivi de ’o’ (eo, ello, ellllo)")

regexHelloStar.txt

’e’suivi de 0 ou plusieurs’ll’suivi de’o’(eo, ello, ellllo)

Eric BERTHOMIER Les Expressions R´eguli`eres (Regular Expressions - RegEx)

(15)

* (´ etoile)

Teste si l’´el´ement qui le pr´ec`ede est pr´esent z´ero ouplusieurs fois.

Exemple d’utilisation de*

ab*c validera les chaˆınes ”ac”, ”abc”, ”abbbc” . . .

[xyz]*validera ””, ”x”, ”y”, ”z”, ”zx”, ”zyx”, ”xyzzy”, et ainsi de suite.

(ab)* validera ””, ”ab”, ”abab”, ”ababab” . . .

regexHelloStar.py

#!/usr/bin/python3

# -*- coding: UTF-8 -*-

importre

string1 ="Hello, world." ifre.search(r"e(ll)*o", string1):

print("’e’ suivi de 0 ou plusieurs ’ll’ suivi de ’o’ (eo, ello, ellllo)")

regexHelloStar.txt

’e’suivi de 0 ou plusieurs’ll’suivi de’o’(eo, ello, ellllo)

(16)

* (´ etoile)

Teste si l’´el´ement qui le pr´ec`ede est pr´esent z´ero ouplusieurs fois.

Exemple d’utilisation de*

ab*c validera les chaˆınes ”ac”, ”abc”, ”abbbc” . . .

[xyz]*validera ””, ”x”, ”y”, ”z”, ”zx”, ”zyx”, ”xyzzy”, et ainsi de suite.

(ab)* validera ””, ”ab”, ”abab”, ”ababab” . . . regexHelloStar.py

#!/usr/bin/python3

# -*- coding: UTF-8 -*-

importre

string1 ="Hello, world."

ifre.search(r"e(ll)*o", string1):

print("’e’ suivi de 0 ou plusieurs ’ll’ suivi de ’o’ (eo, ello, ellllo)")

regexHelloStar.txt

’e’suivi de 0 ou plusieurs’ll’suivi de’o’(eo, ello, ellllo)

Eric BERTHOMIER Les Expressions R´eguli`eres (Regular Expressions - RegEx)

(17)

ˆ(accent circonflexe)

Teste le d´ebut de ligne (fichier texte) ou d’une chaˆıne de caract`ere.

regexHelloCirc.py

#!/usr/bin/python3

# -*- coding: UTF-8 -*-

importre

string1 ="Hello, world" ifre.search(r"^Hell", string1):

print(string1," est une ligne ou une chaine de caracteres commencant par ’Hell’")

regexHelloCirc.txt

Hello, world est une ligne ou une chaine de caracteres commencant par’Hell’

(18)

ˆ(accent circonflexe)

Teste le d´ebut de ligne (fichier texte) ou d’une chaˆıne de caract`ere.

regexHelloCirc.py

#!/usr/bin/python3

# -*- coding: UTF-8 -*-

importre

string1 ="Hello, world"

ifre.search(r"^Hell", string1):

print(string1," est une ligne ou une chaine de caracteres commencant par ’Hell’")

regexHelloCirc.txt

Hello, world est une ligne ou une chaine de caracteres commencant par’Hell’

Eric BERTHOMIER Les Expressions R´eguli`eres (Regular Expressions - RegEx)

(19)

$ (dollar)

Teste la fin de ligne (fichier texte) ou d’une chaˆıne de caract`ere.

regexHelloDollar.py

#!/usr/bin/python3

# -*- coding: UTF-8 -*-

importre

string1 ="Hello, world" ifre.search(r"rld$", string1):

print(string1," est une ligne ou une chaine de caracteres se terminant par ’rld’")

regexHelloDollar.txt

Hello, world est une ligne ou une chaine de caracteres se terminant par’rld’

(20)

$ (dollar)

Teste la fin de ligne (fichier texte) ou d’une chaˆıne de caract`ere.

regexHelloDollar.py

#!/usr/bin/python3

# -*- coding: UTF-8 -*-

importre

string1 ="Hello, world"

ifre.search(r"rld$", string1):

print(string1," est une ligne ou une chaine de caracteres se terminant par ’rld’")

regexHelloDollar.txt

Hello, world est une ligne ou une chaine de caracteres se terminant par’rld’

Eric BERTHOMIER Les Expressions R´eguli`eres (Regular Expressions - RegEx)

(21)

[] (crochets)

Teste un caract`ere contenu entre les crochets.

Exemple d’utilisation de[]

[abc] validera ”a”, ”b”, ou ”c”.

[a-z] specifie l’ensemble des caract`eres minuscules de ”a” `a

”z”.

Ces formes peuvent ˆetre combin´ees

[abcx-z]validera ”a”, ”b”, ”c”, ”x”, ”y” ou ”z”, comme le ferait[a-cx-z].

(22)

[] (crochets)

Teste un caract`ere contenu entre les crochets.

Exemple d’utilisation de[]

[abc] validera ”a”, ”b”, ou ”c”.

[a-z] specifie l’ensemble des caract`eres minuscules de ”a” `a

”z”.

Ces formes peuvent ˆetre combin´ees

[abcx-z]validera ”a”, ”b”, ”c”, ”x”, ”y” ou ”z”, comme le ferait[a-cx-z].

Eric BERTHOMIER Les Expressions R´eguli`eres (Regular Expressions - RegEx)

(23)

[] (crochets)

Teste un caract`ere contenu entre les crochets.

Exemple d’utilisation de[]

[abc] validera ”a”, ”b”, ou ”c”.

[a-z] specifie l’ensemble des caract`eres minuscules de ”a” `a

”z”.

Ces formes peuvent ˆetre combin´ees

[abcx-z]validera ”a”, ”b”, ”c”, ”x”, ”y” ou ”z”, comme le ferait[a-cx-z].

(24)

Sp´ ecificit´ es des [] (crochets)

Les caract`eres -et[

Le caract`ere - est traˆıt´e comme un caract`ere litt´eral si il est le dernier caract`ere ou le premier de l’ensemble (apr`es le ˆ, si ce dernier est pr´esent) : [abc-], [-abc].

Le caract`ere ]peut ˆetre inclus dans l’ensemble si c’est le premier caract`ere (apr`es le ˆ) : []abc].

Le caract`ere antislash (\)

Il n’est pas possible d’utiliser le caract`ere de protection antislash (\) pour prot´eger un caract`ere.

Eric BERTHOMIER Les Expressions R´eguli`eres (Regular Expressions - RegEx)

(25)

Sp´ ecificit´ es des [] (crochets)

Les caract`eres -et[

Le caract`ere - est traˆıt´e comme un caract`ere litt´eral si il est le dernier caract`ere ou le premier de l’ensemble (apr`es le ˆ, si ce dernier est pr´esent) : [abc-], [-abc].

Le caract`ere ]peut ˆetre inclus dans l’ensemble si c’est le premier caract`ere (apr`es le ˆ) : []abc].

Le caract`ere antislash (\)

Il n’est pas possible d’utiliser le caract`ere de protection antislash (\) pour prot´eger un caract`ere.

(26)

Exemple d’utilisation de []

regexHelloBracket.py

#!/usr/bin/python3

# -*- coding: UTF-8 -*-

importre

string1 ="Hello, world."

ifre.search(r"[aeiou]+", string1):

print(string1," contient au moins une voyelle.")

regexHelloBracket.txt

Hello, world. contient au moins une voyelle.

Eric BERTHOMIER Les Expressions R´eguli`eres (Regular Expressions - RegEx)

(27)

[ˆ. . . ]

V´erifie l’absenced’un caract`ere dans l’ensemble d´efini entre [].

Exemple d’utilisation de[]

[^abc]v´erifie que tous les caract`eres autre que”a”, ”b”, or

”c”.

[^a-z]v´erfie l’absence de tout caract`ere minuscule de ”a” `a

”z”.

Comme auparavent, ces formes peuvent ˆetre combin´ees.

(28)

[ˆ. . . ]

V´erifie l’absenced’un caract`ere dans l’ensemble d´efini entre [].

Exemple d’utilisation de[]

[^abc]v´erifie que tous les caract`eres autre que”a”, ”b”, or

”c”.

[^a-z]v´erfie l’absence de tout caract`ere minuscule de ”a” `a

”z”.

Comme auparavent, ces formes peuvent ˆetre combin´ees.

Eric BERTHOMIER Les Expressions R´eguli`eres (Regular Expressions - RegEx)

(29)

[ˆ. . . ]

V´erifie l’absenced’un caract`ere dans l’ensemble d´efini entre [].

Exemple d’utilisation de[]

[^abc]v´erifie que tous les caract`eres autre que”a”, ”b”, or

”c”.

[^a-z]v´erfie l’absence de tout caract`ere minuscule de ”a” `a

”z”.

Comme auparavent, ces formes peuvent ˆetre combin´ees.

(30)

Exemple d’utilisation de [ˆ. . . ]

regexHelloNotBracket.py

#!/usr/bin/python3

# -*- coding: UTF-8 -*-

importre

string1 ="Hello World\n"

ifre.search(r"[^abc]", string1):

print( string1 +" contient au moins un caractere autre que a, b, et c")

regexHelloNotBracket.txt

Hello World

contient au moins un caractere autre que a, b, et c

Eric BERTHOMIER Les Expressions R´eguli`eres (Regular Expressions - RegEx)

(31)

Choix alternatifs ( . . . | . . . )

regexHelloOrBracket.py

#!/usr/bin/python3

# -*- coding: UTF-8 -*-

importre

string1 ="Hello World."

ifre.search(r"(Hello|Hi|Pogo)", string1):

print(’Au moins une des chaines "Hello", "Hi" ou "Pogo" est contenue dans ’+ string1)

regexHelloOrBracket.txt

Au moins une des chaines"Hello","Hi"ou"Pogo"est contenue dans Hello World.

(32)

Sous-Expression ()

()d´efinit une sous-expression. La chaˆıne ainsi trouv´ee peut ˆetre r´eutilis´ee par la suite. Une telle chaˆıne est nomm´ee groupe.

regexHelloGroup.py

#!/usr/bin/python3

# -*- coding: UTF-8 -*-

importre

string1 ="Hello, world."

m_obj = re.search(r"(H..).(o..)(...)",string1) ifre.search(r"(H..).(o..)(...)",string1):

print("Chaine valide : ’"+ m_obj.group(1) +"’ and ’"+ m_obj.group(2) +"’ and ’"+ m_obj .group(3)+"’")

regexHelloGroup.txt

Chaine valide :’Hel’and’o, ’and’wor’

Eric BERTHOMIER Les Expressions R´eguli`eres (Regular Expressions - RegEx)

(33)

Sous-Expression ()

()d´efinit une sous-expression. La chaˆıne ainsi trouv´ee peut ˆetre r´eutilis´ee par la suite. Une telle chaˆıne est nomm´ee groupe.

regexHelloGroup.py

#!/usr/bin/python3

# -*- coding: UTF-8 -*-

importre

string1 ="Hello, world."

m_obj = re.search(r"(H..).(o..)(...)",string1) ifre.search(r"(H..).(o..)(...)",string1):

print("Chaine valide : ’"+ m_obj.group(1) +"’ and ’"+ m_obj.group(2) +"’ and ’"+ m_obj .group(3)+"’")

regexHelloGroup.txt

Chaine valide :’Hel’and’o, ’and’wor’

(34)

{m,n}

{m,n}valide si l’´el´ement qui pr´ec`ede est indiqu´e au moins m fois et au plus n fois.

Par exemple,a{3,5} valide seulement les chaˆınes

”aaa”, ”aaaa”, and ”aaaaa”.

Eric BERTHOMIER Les Expressions R´eguli`eres (Regular Expressions - RegEx)

(35)

{m,n}

{m,n}valide si l’´el´ement qui pr´ec`ede est indiqu´e au moins m fois et au plus n fois. Par exemple,a{3,5} valide seulement les chaˆınes

”aaa”, ”aaaa”, and ”aaaaa”.

(36)

A vous de jouer ! `

Eric BERTHOMIER Les Expressions R´eguli`eres (Regular Expressions - RegEx)

Références

Documents relatifs

However, when the $ metacharacter is added to the pattern, the regular expression pattern engine must match the sequence of three literal characters art and must also match

Unlike Perl and awk (but like Tcl and Python), regular expressions in Emacs elisp scripts are often provided to the regex engine as string literals, so we can feel free to use \t

If you pass an array of regular expression strings as the first parameter, preg_replace() will use the regular expressions one by one to search and

The literal character (number) 7 in the regular expression matches the four instances of the number 7 in the text you are matching..

We are using this to search for the hexadecimal code associated with the ASCII characters that we want in a source (manipulation of raw hex data sources is a different book)..

The best known upper bound is from Br¨ uggeman- Klein and Wood, who showed that the problem is in EXPTIME (by exhibiting an algorithm that works in polynomial time on the minimal

Syntaxe de l’adressage indirect par registre en langage symbolique.- Comme nous l’avons d´ej` a vu, en langage symbolique, pour d´esigner une constante on ´ecrit celle-ci

Exercice 4 : cryptage Ecrire un programme qui demande ` a l’utilisateur de saisir 26 lettres pour chiffrer les 26 lettres de l’alphabet (et v´ erifie qu’il ne rentre pas deux fois