Échappement des caractères spéciaux dans les regex Python
Supposons que vous ayez besoin qu'un caractère spécial représente lui-même. Pour cela, il faut l'échapper avec un backslash (barre oblique inverse). Regardons des exemples.
Exemple
Dans l'exemple suivant, l'auteur de l'expression régulière voulait
que le motif de recherche soit : lettre
'a', puis un plus '+', puis
lettre 'x'. Cependant, l'auteur du code
n'a pas échappé le symbole '+' et donc
le motif de recherche est en réalité :
lettre 'a' une ou plusieurs fois,
puis lettre 'x' :
txt = 'a+x ax aax aaax'
res = re.sub('a+x', '!', txt)
print(res)
Résultat de l'exécution du code :
'a+x ! ! !'
Exemple
Maintenant, l'auteur a échappé le plus avec un backslash.
Le motif de recherche est maintenant correct :
lettre 'a', puis un plus
'+', puis lettre 'x' :
txt = 'a+x ax aax aaax'
res = re.sub('a\+x', '!', txt)
print(res)
Résultat de l'exécution du code :
'! ax aax aaax'
Exemple
Dans cet exemple, le motif est :
lettre 'a', puis un point '.',
puis lettre 'x' :
txt = 'a.x abx azx'
res = re.sub('a\.x', '!', txt)
print(res)
Résultat de l'exécution du code :
'! abx azx'
Exemple
Dans l'exemple suivant, l'auteur a oublié d'échapper le point et toutes les sous-chaînes ont été capturées, car un point non échappé représente n'importe quel caractère :
txt = 'a.x abx azx'
res = re.sub('a.x', '!', txt)
print(res)
Résultat de l'exécution du code :
'! ! !'
Remarque
Notez que si vous oubliez le backslash pour le point (lorsqu'il doit représenter lui-même) - cela peut passer inaperçu :
res = re.sub('a.x', '!', 'a.x')
print(res) # retourne '!', comme nous le voulions
Visuellement, cela fonctionne correctement (car le point
représente n'importe quel caractère, y compris
un point normal '.'). Mais si on change
la chaîne dans laquelle les remplacements ont lieu - nous
verrons notre erreur :
res = re.sub('a.x', '!', 'a.x abx azx')
print(res) # retourne '! ! !', mais on attendait '! abx azx'
Liste des caractères spéciaux et ordinaires
Si vous échappez un caractère ordinaire - rien de grave ne se produit - il représentera toujours lui-même. Exception : les chiffres, ils ne peuvent pas être échappés.
On doute souvent si un symbole donné est spécial. Certains en viennent à échapper tous les symboles suspects les uns après les autres. Cependant, c'est une mauvaise pratique (cela encombre l'expression régulière de backslashes).
Les caractères spéciaux sont : $ ^ . * + ? \ / {} [] () |
Ne sont pas des caractères spéciaux : @ : , ' " - _ = < > % # ~ `& !
Tâches pratiques
Soit la chaîne :
txt = 'a.a aba aea'
Écrivez une expression régulière qui trouvera la chaîne
'a.a', sans capturer les autres.
Soit la chaîne :
txt = '2+3 223 2223'
Écrivez une expression régulière qui trouvera la chaîne
'2+3', sans capturer les autres.
Soit la chaîne :
txt = '23 2+3 2++3 2+++3 345 567'
Écrivez une expression régulière qui trouvera les chaînes
'2+3', '2++3', '2+++3',
sans capturer les autres (+ peut être n'importe quel
nombre).
Soit la chaîne :
txt = '23 2+3 2++3 2+++3 445 677'
Écrivez une expression régulière qui trouvera les chaînes
'23', '2+3', '2++3',
'2+++3', sans capturer les autres.
Soit la chaîne :
txt = '*+ *q+ *qq+ *qqq+ *qqq qqq+'
Écrivez une expression régulière qui trouvera les chaînes
'*q+', '*qq+', '*qqq+',
sans capturer les autres.
Soit la chaîne :
txt = '[abc] {abc} abc (abc) [abc]'
Écrivez une expression régulière qui trouvera les chaînes
entre crochets et les remplacera par
'!'.