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) .