En Python, je peux compiler une expression régulière sans tenir compte de la casse avec 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>
Est-il possible de faire la même chose, mais sans utiliser re.compile
. Je ne trouve rien de tel que le suffixe i
de Perl (par exemple, m/test/i
) dans la documentation.
Vous pouvez également effectuer des recherches insensibles à la casse à l'aide de la fonction de recherche/correspondance sans l'indicateur 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'
Le marqueur insensible à la casse, (?i)
peut être incorporé 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']
Vous pouvez également définir la casse lors de la compilation du modèle:
pattern = re.compile('FIle:/+(.*)', re.IGNORECASE)
Dans les importations
import re
En traitement 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 une perte de temps. Chaque fois que la méthode de correspondance ci-dessus est appelée, l'expression régulière est compilée. C'est également une pratique erronée dans d'autres langages de programmation. Le ci-dessous est la meilleure pratique.
Dans l'initialisation de l'application:
self.RE_TEST = re.compile('test', re.IGNORECASE)
En traitement d'exécution:
if self.RE_TEST.match('TeSt'):
#'re.IGNORECASE' for case insensitive results short form re.I
#'re.match' returns the first match located from the start of the string.
#'re.search' returns location of the where the match is found
#'re.compile' creates a regex object that can be used for multiple matches
>>> s = r'TeSt'
>>> print (re.match(s, r'test123', re.I))
<_sre.SRE_Match object; span=(0, 4), match='test'>
# OR
>>> pattern = re.compile(s, re.I)
>>> print(pattern.match(r'test123'))
<_sre.SRE_Match object; span=(0, 4), match='test'>
Pour effectuer des opérations ne respectant pas la casse, fournissez re.IGNORECASE.
>>> import re
>>> test = 'UPPER TEXT, lower text, Mixed Text'
>>> re.findall('text', test, flags=re.IGNORECASE)
['TEXT', 'text', 'Text']
et si nous voulons remplacer le texte correspondant à la casse ...
>>> def matchcase(Word):
def replace(m):
text = m.group()
if text.isupper():
return Word.upper()
Elif text.islower():
return Word.lower()
Elif text[0].isupper():
return Word.capitalize()
else:
return Word
return replace
>>> re.sub('text', matchcase('Word'), test, flags=re.IGNORECASE)
'UPPER Word, lower Word, Mixed Word'