Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Quantificateurs ?

5 réponses
Avatar
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

5 réponses

Avatar
Pierre Maurette

[...]

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

Avatar
Bruno Desthuilliers
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

Avatar
Bruno Desthuilliers

[...]

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 !-)


Avatar
MCI, Shadok Gouroudoudou
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

Avatar
Pierre Maurette

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