456 votes

Expression régulière insensible à la casse sans re.compile ?

En Python, je peux compiler une expression régulière pour qu'elle soit insensible à la casse en utilisant re.compile :

>>> s = 'TeSt'
>>> casesensitive = re.compile('test')
>>> ignorecase = re.compile('test', re.IGNORECASE)
>>> 
>>> print casesensitive.match(s)
None
>>> print ignorecase.match(s)
<_sre.SRE_Match object at 0x02F0B608>

Existe-t-il un moyen de faire la même chose, mais sans utiliser la fonction re.compile . Je ne trouve rien qui ressemble à l'outil Perl i suffixe (par exemple m/test/i ) dans la documentation.

3 votes

Vous trouverez une excellente introduction aux experssoins réguliers sur le site : python-course.eu/re.php

734voto

Michael Haren Points 42641

Passez re.IGNORECASE à la flags param de search , match ou sub :

re.search('test', 'TeSt', re.IGNORECASE)
re.match('test', 'TeSt', re.IGNORECASE)
re.sub('test', 'xxxx', 'Testing', flags=re.IGNORECASE)

3 votes

re.match('test', 'TeSt', re.IGNORECASE) pourrait conduire à TypeError lorsque l'un ou l'autre de l'attribut étant None . Utilisation de try & except pour attraper TypeError correspondance par première_chaîne == deuxième_chaîne. Exemple de code def equal_ignore_case(first_string, second_string): try: return re.match(first_string, second_string, re.IGNORECASE) is not None except (AttributeError, TypeError): return first_string == second_string Code démo

5 votes

@Abhijeet Vous ne devriez vraiment pas utiliser try/except dans ce cas. Vérifiez simplement si l'une des chaînes de caractères est None d'abord.

6 votes

Il est important d'utiliser l'argument nommé flags para re.sub sinon il passe re.IGNORECASE à la count argument (s. aussi stackoverflow.com/questions/42581/ )

128voto

aem999 Points 2717

Vous pouvez également effectuer des recherches sans tenir compte de la casse en utilisant search/match sans le drapeau IGNORECASE (testé dans Python 2.7.3) :

re.search(r'(?i)test', 'TeSt').group()    ## returns 'TeSt'
re.match(r'(?i)test', 'TeSt').group()     ## returns 'TeSt'

2 votes

La documentation ne mentionne pas que la fonctionnalité a été ajoutée dans une version particulière (contrairement à, disons (?(condition)yes|no) qui, selon le document, a été ajouté en 2.4), je pense donc qu'il a toujours été disponible depuis la première version de l'interface utilisateur. re qui, je crois, a été ajouté dans la version 1.5. En gros, depuis le début des temps pour tout ce qui concerne Python. Il est documenté à peu près à la moitié de la première section de cette page : docs.python.org/2/library/re.html#regular-expression-syntaxe

4 votes

Voilà - J'ai parcouru la documentation de la version 1.5 et je l'ai trouvée documentée à environ 60 % de cette page : docs.python.org/release/1.5/lib/ J'ai également vérifié la documentation de la version 1.4, qui ne fait aucune mention de cette fonctionnalité. Je suppose donc qu'elle a été ajoutée dans la version 1.5, lorsque la fonction regex a été déprécié au profit du module re module.

3 votes

C'est une solution intéressante car elle ne nécessite pas de drapeau. Dans mon cas, je stocke des chaînes de recherche dans Redis et cette solution est vraiment utile.

75voto

Raymond Hettinger Points 231

Le marqueur insensible à la casse, (?i) peuvent être incorporés directement dans le motif regex :

>>> import re
>>> s = 'This is one Test, another TEST, and another test.'
>>> re.findall('(?i)test', s)
['Test', 'TEST', 'test']

5 votes

Meilleure option, rend la regex portable sur toutes les plateformes et l'intention est claire lors de la déclaration.

3 votes

Este '(?i)' a également l'avantage de vous permettre de créer une liste de regexp, dont certaines sont insensibles à la casse et d'autres non. (Et bien sûr, vous pouvez faire correspondre re.compile sur cette liste si vous le souhaitez).

0 votes

@SinaMadani Je suis confus. En quoi est-ce plus portable que flags=re.IGNORECASE ?

19voto

panofish Points 619

Vous pouvez également définir le respect de la casse lors de la compilation du modèle :

pattern = re.compile('FIle:/+(.*)', re.IGNORECASE)

8 votes

Dans la question, l'OP utilise cette méthode et demande s'il existe une autre façon de procéder.

10 votes

Utile pour ceux qui défilent rapidement.

9voto

Douglas Daseeco Points 1398

Dans les importations

import re

Dans le traitement en cours d'exécution :

RE_TEST = r'test'
if re.match(RE_TEST, 'TeSt', re.IGNORECASE):

Il convient de mentionner que le fait de ne pas utiliser re.compile est un gaspillage. Chaque fois que la méthode match ci-dessus est appelée, l'expression régulière sera compilée. Cette pratique est également erronée dans d'autres langages de programmation. La méthode ci-dessous est la meilleure.

Initialisation de l'application :

self.RE_TEST = re.compile('test', re.IGNORECASE)

Dans le traitement en cours d'exécution :

if self.RE_TEST.match('TeSt'):

1 votes

Merci ! Personne ne parle jamais de compiler, pourtant c'est l'option la plus intelligente !

2 votes

L'OP demande littéralement une solution qui n'a pas utiliser re.compile() ....

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X