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

restreindre 1 mot comme sensible à la casse et autre comme insensible à la casse dans python regex | (tuyau)

Dans Python 3.6 et versions ultérieures, vous pouvez utiliser les groupes de modificateurs en ligne :

>>> s = "Welcome to PuNe, Maharashtra"
>>> print(re.findall(r"PuNe|(?i:MaHaRaShTrA)",s))
['PuNe', 'Maharashtra']

Voir le Python re correspondant documents :

(?aiLmsux-imsx:...)
(Zéro ou plusieurs lettres de l'ensemble 'a' , 'i' , 'L' , 'm' , 's' , 'u' , 'x' , éventuellement suivi de '-' suivi d'une ou plusieurs lettres du 'i' , 'm' , 's' , 'x' .) Les lettres définissent ou suppriment les drapeaux correspondants :re.A (correspondance ASCII uniquement), re.I (ignorer la casse), re.L (selon les paramètres régionaux), re.M (multiligne), re.S (le point correspond à tout), re.U (correspondance Unicode) et re.X (verbeux), pour la partie de l'expression. (Les drapeaux sont décrits dans le contenu du module.)

Les lettres 'a' , 'L' et 'u' sont mutuellement exclusifs lorsqu'ils sont utilisés comme drapeaux intégrés, ils ne peuvent donc pas être combinés ou suivre '-' . Au lieu de cela, lorsque l'un d'eux apparaît dans un groupe en ligne, il remplace le mode de correspondance dans le groupe englobant. Dans les modèles Unicode (?a:...) passe à la correspondance ASCII uniquement et (?u:...) passe à la correspondance Unicode (par défaut). Dans le modèle d'octet (?L:...) bascule vers les paramètres régionaux en fonction de la correspondance, et (?a:...) passe à la correspondance ASCII uniquement (par défaut). Ce remplacement n'est effectif que pour le groupe en ligne étroit et le mode de correspondance d'origine est restauré en dehors du groupe.

Nouveau dans la version 3.6.

Modifié dans la version 3.7 :Les lettres 'a', 'L' et 'u' peuvent également être utilisées dans un groupe.

Malheureusement, Python re les versions antérieures à la 3.6 ne prenaient pas en charge ces groupes, pas plus qu'elles ne prenaient en charge l'alternance des modificateurs en ligne activés et désactivés.

Si vous pouvez utiliser le module regex PyPi, vous pouvez utiliser un (?i:...) construire :

import regex
s = "Welcome to PuNe, Maharashtra"
print(regex.findall(r"PuNe|(?i:MaHaRaShTrA)",s))

Voir la démo Python en ligne.


Vous pouvez générer la regex minuscule/majuscule pour le deuxième mot et garder la casse active :

my_regex = "PuNe|"+"".join("[{}{}]".format(x.upper(),x.lower()) for x in "MaHaRaShTrA")

qui génère :PuNe|[Mm][Aa][Hh][Aa][Rr][Aa][Ss][Hh][Tt][Rr][Aa]

et re.search(my_regex,s1) sans aucune option fait ce que vous voulez.