Le trait d'union dans les ensembles des expressions régulières Python
Le trait d'union est aussi un métacaractère à l'intérieur de [ ]
(mais pas à l'extérieur). Si vous avez besoin du trait d'union lui-même
comme caractère - placez-le à un endroit
où il ne sera pas interprété comme un séparateur
d'intervalle.
Pourquoi c'est important : vous pouvez créer un intervalle
de caractères sans vous en rendre compte. Par exemple,
comme ceci - '[:-@]' - vous pensez
sélectionner le deux-points, le trait d'union et l'arobase, alors qu'en
rèalité vous obtenez l'intervalle de caractères entre
: et @. Cet intervalle inclut
les caractères suivants : ? < = > :
D'où viennent-ils ? De la table ASCII - le deux-points a un numéro inférieur à celui de l'arobase - et cela forme un intervalle. C'est-à-dire que tous les intervalles sont basés sur la table ASCII (on peut utiliser cette propriété si on le souhaite).
Comment résoudre ceci : placez le caractère
trait d'union à un endroit où il ne sera certainement pas interprété
comme définissant un intervalle, par exemple, au début ou
à la fin (c'est-à-dire après [ ou avant
]).
On peut aussi échapper le trait d'union - alors
il représentera lui-même, indépendamment
de sa position. Par exemple, au lieu de [:-@]
écrire [:\-@] - et il n'y aura plus d'intervalle,
mais trois caractères - le deux-points,
le trait d'union et l'arobase @.
Exemple
Dans l'exemple suivant, le motif de recherche est :
chiffre 1, puis lettre de 'a'
à 'z', puis chiffre 2 :
txt = '1a2 1-2 1c2 1z2'
res = re.sub('1[a-z]2', '!', txt)
print(res)
Résultat de l'exécution du code :
'! 1-2 ! !'
Exemple
Échappons maintenant le trait d'union.
Le motif de recherche devient : chiffre
1, puis lettre 'a', ou
trait d'union, ou lettre 'z', puis chiffre
2 :
txt = '1a2 1-2 1c2 1z2'
res = re.sub('1[a\-z]2', '!', txt)
print(res)
Résultat de l'exécution du code :
'! ! 1c2 !'
Exemple
On peut simplement déplacer le trait d'union, sans l'échapper :
txt = '1a2 1-2 1c2 1z2'
res = re.sub('1[az-]2', '!', txt)
print(res)
Résultat de l'exécution du code :
'! ! 1c2 !'
Exemple
Dans l'exemple suivant, le motif de recherche est :
premier caractère - lettres minuscules ou
trait d'union '-', puis deux lettres
'x' :
txt = 'axx Axx -xx @xx'
res = re.sub('[a-z-]xx', '!', txt)
print(res)
Résultat de l'exécution du code :
'! Axx ! @xx'
Exemple
Dans l'exemple suivant, le motif de recherche est :
premier caractère - lettres minuscules, majuscules
ou trait d'union '-', puis deux lettres
'x' :
txt = 'axx Axx -xx @xx'
res = re.sub('[a-zA-Z-]xx', '!', txt)
print(res)
Résultat de l'exécution du code :
'! ! ! @xx'
Exemple
On peut placer le trait d'union entre deux groupes - là, il ne créera certainement pas un autre intervalle :
txt = 'axx 9xx -xx @xx'
res = re.sub('[a-z-0-9]xx', '!', txt)
print(res)
Résultat de l'exécution du code :
'! ! ! @xx'
Problèmes pratiques
Soit la chaîne :
txt = 'xaz xBz xcz x-z x@z'
Trouvez toutes les chaînes correspondant au motif suivant :
lettre 'x', lettre majuscule ou minuscule
ou trait d'union, lettre 'z'.
Soit la chaîne :
txt = 'xaz x$z x-z xcz x+z x%z x*z'
Trouvez toutes les chaînes correspondant au motif suivant :
lettre 'x', puis soit le dollar, soit
le trait d'union, soit le plus, puis lettre 'z'.