Quantificateurs ?

Le
Pierre Maurette
Bonjour,

Pour l'instant je filtre - en capture ou en exclusion - sur des
extensions. Ça marche bien, à base de:
os.path.splitext(nomcomplet)[1][1:]

Maintenant je souhaiterais affiner un peu, pour au moins gérer des noms
comme '.htaccess', 'optionDB', etc. Je voudrais également pouvoir
accepter - ou refuser - un nom particulier, bien entendu. En bref, je
souhaite utiliser des quantificateurs[1] '*' et éventuellement '?'. Par
exemple '*.py', '__*.py', et peut-être '*.py?'. En gros comme le
filetype dans tkFileDialog, mais je pense que le filtrage est fait par
l'OS. Je ne souhaite pas nécessairement la grammaire complète si elle
existe, d'ailleurs je me contente de '*' et parfois de '?' depuis 25
ans sous DOS (et aujourd'hui Linux, par exemple).
Il y a saisie des filtres, donc je ne peux pas partir de regex. Si je
les utilise il me faut les fabriquer.

Qu'est-ce qui pourrait m'aider dans les modules standard et qui m'a
échappé ? Un truc genre os.path.match(filename, '*.py'). Ce que je
crains c'est de ma lancer dans du codage sauvage avant de me rendre
compte que ça existait prêt à consommer

Puisque j'y suis, une question qui ne méritait pas d'ouvrir un fil:
existe-t-il une fonction pour tester qu'un chemin est 'à l'intérieur'
d'un autre. Pour l'instant j'utilise:
os.path.normpath(path[:len(ldpath)]) == os.path.normpath(ldpath)

Merci pour votre patience, et par avance pour vos avis éclairés.

[1] 'quantificateur / quantifier' sont-ils les bons termes pour
chercher sur Google ?

--
Pierre Maurette
Questions / Réponses high-tech
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Pierre Maurette
Le #613691

[...]

http://www.python.org/doc/lib/module-fnmatch.html


Mille merci(s?). Il était dans ma doc, mais je ne l'aurais pas trouvé
sans votre aide, en tout cas avant d'avoir passé pas mal de temps à
réinventer la roue.

Il a un drôle de nom, ce module. Existe-t-il un pcmatch, psmatch,
umpmatch, modemmatch(*), etc. ?

(*) Celui-ci mérite une explication, l'information étant toute fraîche.
Le troisième homme, l'oreillu au tracteur, a fondé le Mouvement
Démocrate, dont il expliquait aujourd'hui qu'on devra l'appeler "le
Modem". J'ignore s'il était sérieux ou facétieux ...

--
Pierre Maurette

Bruno Desthuilliers
Le #613690
Bonjour,

Pour l'instant je filtre - en capture ou en exclusion - sur des
extensions. Ça marche bien, à base de:
os.path.splitext(nomcomplet)[1][1:]

Maintenant je souhaiterais affiner un peu, pour au moins gérer des noms
comme '.htaccess', 'optionDB', etc. Je voudrais également pouvoir
accepter - ou refuser - un nom particulier, bien entendu. En bref, je
souhaite utiliser des quantificateurs[1] '*' et éventuellement '?'. Par
exemple '*.py', '__*.py', et peut-être '*.py?'.


http://www.python.org/doc/lib/module-fnmatch.html

Bruno Desthuilliers
Le #613429

[...]

http://www.python.org/doc/lib/module-fnmatch.html



Mille merci(s?). Il était dans ma doc, mais je ne l'aurais pas trouvé
sans votre aide, en tout cas avant d'avoir passé pas mal de temps à
réinventer la roue.

Il a un drôle de nom, ce module.


AMHA, "fn" => "file name".

Existe-t-il un pcmatch, psmatch,
umpmatch, modemmatch(*), etc. ?


On n'est pas encore vendredi, pourtant ?-)

(*) Celui-ci mérite une explication, l'information étant toute fraîche.
Le troisième homme, l'oreillu au tracteur, a fondé le Mouvement
Démocrate, dont il expliquait aujourd'hui qu'on devra l'appeler "le
Modem". J'ignore s'il était sérieux ou facétieux ...


Personnellement, je propose un "Mouvement Démocrate Républicain" (mdr !-)


MCI, Shadok Gouroudoudou
Le #613427
Bonjour !

http://www.python.org/doc/lib/module-fnmatch.html


Attention à un détail : fnmatch (comm glob un autre module standard du
même secteur) se comporte "comme sous Unix" même sous windows. Cela
sous-entend certaines différences de comportement, entre ces modules et
des instructions standards de windows, comme DIR, DEL, COPY, etc.






--
@-salutations

Michel Claveau

Pierre Maurette
Le #612894

Réponse à Bruno et au shadok: ça fonctionne sous Windows et Linux,
c'est même redoutablement efficace. Comme j'ai une liste d'expressions
avec qunatificateurs, je repasse par des regex:

compiledpattern = re.compile('|'.join([fnmatch.translate(pat) for pat
in self.dicodata[self.dicodata['mode']]])
, re.IGNORECASE)

self.is_authorized_path = {
'all' : lambda pathname: True
, 'ignore' : lambda pathname: not
re.match(compiledpattern, pathname)
, 'force' : lambda pathname:
re.match(compiledpattern, pathname)
}[self.dicodata['mode']]

Merci, et bonne fin de week-end.

--
Pierre Maurette
Publicité
Poster une réponse
Anonyme