Python >> Tutoriel Python >  >> Python Tag >> RegEx

Drapeaux Python Regex

Dans de nombreuses fonctions Python regex, vous voyez un troisième argument flags . Que sont-ils et comment fonctionnent-ils ?

Les drapeaux vous permettent de contrôler le moteur d'expressions régulières. Parce que les expressions régulières sont si puissantes, elles sont un moyen utile d'activer et de désactiver certaines fonctionnalités (par exemple, s'il faut ignorer les majuscules lors de la correspondance avec votre regex).

Par exemple, voici comment le troisième argument flags est utilisé dans le re.findall() méthode :

re.findall(pattern, string, flags=0)

Ainsi, l'argument flags semble être un argument entier avec la valeur par défaut de 0. Pour contrôler le comportement par défaut des regex, vous utilisez simplement l'une des valeurs entières prédéfinies. Vous pouvez accéder à ces valeurs prédéfinies via la bibliothèque re :

Syntaxe Signification
re.ASCII Si vous n'utilisez pas cet indicateur, les symboles spéciaux Python regex \w , \W , \b , \B , \d , \D , \s et \S correspondra aux caractères Unicode. Si vous utilisez cet indicateur, ces symboles spéciaux ne correspondront qu'aux caractères ASCII, comme leur nom l'indique.
re.A Identique à re.ASCII
re.DEBUG Si vous utilisez cet indicateur, Python affichera des informations utiles sur le shell qui vous aideront à déboguer votre regex.
re.IGNORECASE Si vous utilisez cet indicateur, le moteur regex effectuera une correspondance insensible à la casse. Donc, si vous recherchez la classe de caractères [A-Z] , il correspondra également à [a-z] .
re.I Identique à re.IGNORECASE
re.LOCALE N'utilisez jamais ce drapeau. Il est déprécié - l'idée était d'effectuer une correspondance insensible à la casse en fonction de vos paramètres régionaux actuels. Mais ce n'est pas fiable.
re.L Identique à re.LOCALE
re.MULTILINE Cet indicateur active la fonctionnalité suivante :l'expression régulière de début de chaîne '^' correspond au début de chaque ligne (plutôt qu'au début de la chaîne uniquement). Il en va de même pour la regex de fin de chaîne '$' qui correspond désormais également à la fin de chaque ligne dans une chaîne multiligne.
re.M Identique à re.MULTILINE
re.DOTALL Sans utiliser cet indicateur, la regex point '.' correspond à tous les caractères sauf le caractère de saut de ligne '\n' . Activez ce drapeau pour vraiment faire correspondre tous les caractères, y compris le caractère de nouvelle ligne.
re.S Identique à re.DOTALL
re.VERBOSE Pour améliorer la lisibilité des expressions régulières compliquées, vous pouvez autoriser les commentaires et le formatage (multiligne) de la regex elle-même. Ceci est possible avec ce drapeau :tous les caractères d'espacement et les lignes commençant par le caractère '#' sont ignorés dans la regex.
re.X Identique à re.VERBOSE

Comment utiliser ces drapeaux ?

Incluez simplement le drapeau en tant que flag facultatif argument comme suit :

import re

text = '''
    Ha! let me see her: out, alas! he's cold:
    Her blood is settled, and her joints are stiff;
    Life and these lips have long been separated:
    Death lies on her like an untimely frost
    Upon the sweetest flower of all the field.
'''

print(re.findall('HER', text, flags=re.IGNORECASE))
# ['her', 'Her', 'her', 'her']

Comme vous le voyez, le drapeau re.IGNORECASE garantit que toutes les occurrences de la chaîne "her" correspondent, quelle que soit leur capitalisation.

Article connexe : Python Regex Superpower - Le guide ultime

Voulez-vous maîtriser la superpuissance des regex ? Découvrez mon nouveau livre La façon la plus intelligente d'apprendre les expressions régulières en Python avec l'approche innovante en 3 étapes pour un apprentissage actif :(1) étudiez un chapitre de livre, (2) résolvez un puzzle de code et (3) regardez une vidéo de chapitre éducatif.

Comment utiliser plusieurs drapeaux ?

Oui, il suffit de les additionner (les résumer) comme suit :

import re

text = '''
    Ha! let me see her: out, alas! he's cold:
    Her blood is settled, and her joints are stiff;
    Life and these lips have long been separated:
    Death lies on her like an untimely frost
    Upon the sweetest flower of all the field.
'''

print(re.findall('   HER   # Ignored', text,
                 flags=re.IGNORECASE + re.VERBOSE))
# ['her', 'Her', 'her', 'her']

Vous utilisez les deux drapeaux re.IGNORECASE (toutes les occurrences des variantes de chaîne en minuscules ou en majuscules de "her" sont mises en correspondance) et re.VERBOSE (ignorez les commentaires et les espaces blancs dans la regex). Vous les additionnez re.IGNORECASE + re.VERBOSE pour indiquer que vous souhaitez prendre les deux.

Plongeons plus en détail dans les différents drapeaux par exemple.

re.ASCII

Si vous n'utilisez pas cet indicateur, les symboles spéciaux Python regex \w, \W, \b, \B, \d, \D, \s et \S correspondront aux caractères Unicode. Si vous utilisez cet indicateur, ces symboles spéciaux ne correspondront qu'aux caractères ASCII, comme leur nom l'indique.

#########################
# re.ASCII
#########################

s = 'hello wörld'

print(re.findall('\w+', s))
# ['hello', 'wörld']

print(re.findall('\w+', s, flags=re.ASCII))
# ['hello', 'w', 'rld']

re.DEBUG

Si vous utilisez cet indicateur, Python affichera des informations utiles sur le shell qui vous aideront à déboguer votre regex.

#########################
# re.DEBUG
#########################

s = 'hello world'

print(re.findall('\w+', s, flags=re.DEBUG))
'''
MAX_REPEAT 1 MAXREPEAT
  IN
    CATEGORY CATEGORY_WORD

 0. INFO 4 0b0 1 MAXREPEAT (to 5)
 5: REPEAT_ONE 9 1 MAXREPEAT (to 15)
 9.   IN 4 (to 14)
11.     CATEGORY UNI_WORD
13.     FAILURE
14:   SUCCESS
15: SUCCESS
['hello', 'world']
'''

re.IGNORECASE

Si vous utilisez cet indicateur, le moteur regex effectuera une correspondance insensible à la casse. Ainsi, si vous recherchez [A-Z], cela correspondra également à [a-z].

#########################
# re.IGNORECASE
##########################

s = 'HELLO world'

print(re.findall('[a-z]+', s))
# ['world']

print(re.findall('[a-z]+', s, flags=re.IGNORECASE))
# ['HELLO', 'world']

re.MULTILINE

Cet indicateur active la fonctionnalité suivante :l'expression régulière de début de chaîne « ^ » correspond au début de chaque ligne (plutôt qu'uniquement au début de la chaîne). Il en va de même pour la regex de fin de chaîne « $ » qui correspond désormais également à la fin de chaque ligne dans une chaîne multiligne.

#########################
# re.MULTILINE
#########################

s = '''hello
world'''

print(re.findall('^[a-z]+', s))
# ['hello']

print(re.findall('^[a-z]+', s, flags=re.MULTILINE))
# ['hello', 'world']

re.DOTALL

Sans utiliser cet indicateur, l'expression régulière point '.' correspond à tous les caractères, à l'exception du caractère de retour à la ligne '\n'. Activez cet indicateur pour vraiment faire correspondre tous les caractères, y compris le caractère de nouvelle ligne.

#########################
# re.DOTALL
#########################

s = '''hello
world'''

print(re.findall('.+', s))
# ['hello', 'world']

print(re.findall('.*', s, flags=re.DOTALL))
# ['hello\nworld', '']

re.VERBOSE

Pour améliorer la lisibilité des expressions régulières compliquées, vous pouvez autoriser les commentaires et le formatage (multiligne) de la regex elle-même. C'est possible avec ce drapeau :tous les caractères d'espacement et les lignes commençant par le caractère "#" sont ignorés dans la regex.

#########################
# re.VERBOSE
#########################

s = 'hello world'

print(re.findall('.+ #I can now write comments', s, flags=re.VERBOSE))
# ['hello world']

Les ingénieurs de Google, Facebook et Amazon sont des maîtres des expressions régulières. Si vous souhaitez également le devenir, consultez notre nouveau livre :The Smartest Way to Learn Python Regex (Amazon Kindle/Print, s'ouvre dans un nouvel onglet) .