Faire correspondre des chaînes de caractères via des motifs génériques Shell avec fnmatch() et fnmatchcase()

Python dispose de plusieurs outils de recherche de chaînes de caractères. Par conséquent, si vous voulez faire correspondre du texte en utilisant les mêmes motifs (patterns en anglais) de caractères génériques que ceux couramment utilisés dans les shells Unix (par exemple, *.py, Dat[0-9]*.csv, etc.), vous pouvez tout simplement utiliser le module fnmatch.

Le module fnmatch fournit deux fonctionsfnmatch() et fnmatchcase() qui peuvent être utilisées pour effectuer cette tâche. L’utilisation est simple :

>>> from fnmatch import fnmatch, fnmatchcase

>>> fnmatch('toto.txt', '*.txt')
True

>>> fnmatch('toto.txt', '?to.txt')
True

>>> fnmatch('Dat45e.csv', 'Dat[0-9]*')
True

>>> noms = ['Fat1.csv', 'Fat2.csv', 'config.ini', 'toto.py']
>>> [nom for nom in noms if fnmatch(nom, 'Fat*.csv')]
['Fat1.csv', 'Fat2.csv']

>>>

 

Normalement, fnmatch() fait correspondre les motifs en utilisant les mêmes règles de casse que le système de fichiers sous-jacent du système (qui varie en fonction du système d’exploitation).

Donc, si vous travaillez sous Windows, la méthode fnmatch va pas prendre en considération la casse des caractères. Par contre, si vous travaillez sous Unix, elle va respecter la casse des caractères. Par exemple :

>>> # Sur OS X (Mac). La casse des caractères est respectée
>>> fnmatch('toto.txt', '*.TXT')
False
>>> # Sur Windows
>>> fnmatch('toto.txt', '*.TXT')
True
>>>

 

Si cette distinction est importante, vous pouvez utiliser la méthode fnmatchcase() au lieu de fnmatch(). Elle effectuer la recherche en respectant les conventions de minuscule et de majuscule telles que vous les avez fournit à la méthode.

>>> fnmatchcase('toto.txt', '*.TXT')
False
>>>

 

Une caractéristique souvent négligée de ces fonctions est leur utilisation potentielle pour le traitement des données sous forme de structure; c’est à dire un tuple d’informations. Par exemple, supposons que vous ayez un tuple d’adresses comme celui-ci:

adresses = (
  '3215 Av LARA Paris',
  '1060 Av BOISSON Nice',
  '1555 Bd GRANDE VILLE Lyon',
  '9999 Bd CALART Pris',
  '1556 Ru BROADWAY Paris',
)

 

Pour pouvez faire des requêtes de sélections comme suit:

>>> from fnmatch import fnmatchcase
>>> [adr for adr in adresses if fnmatchcase(adr, '* Paris')]
['3215 Av LARA Paris', '1556 Ru BROADWAY Paris']

>>> [adr for adr in adresses if fnmatchcase(adr, '15[0-9][0-9] *Par*')]
['1556 Ru BROADWAY Paris']

>>> 

 

L’appariement effectué par la méthode fnmatch() est placé quelque part entre la fonctionnalité des méthodes simples de traitement des chaînes de caractères et toute la puissance des expressions régulières.

C’est souvent une solution raisonnable dans vos programme – si vous essayez tout simplement de fournir un mécanisme simple pour autoriser les caractères génériques dans les opérations de traitement des données.

Si vous essayez d’écrire du code qui identifie les noms de fichiers, utilisez plutôt le module glob.

LAISSER UN COMMENTAIRE

Please enter your comment!
Please enter your name here