fnmatch — Mustervergleich für Unix-Dateinamen

Quellcode: Lib/fnmatch.py


Dieses Modul unterstützt Platzhalter nach Art der Unix-Shell, die nicht dasselbe sind wie reguläre Ausdrücke (die im Modul re dokumentiert sind). Die besonderen Zeichen in Platzhaltern nach Shell-Art sind:

Muster

Bedeutung

*

passt auf alles

?

passt auf ein beliebiges einzelnes Zeichen

[seq]

passt auf jedes Zeichen in seq

[!seq]

passt auf jedes Zeichen, das nicht in seq ist

Für einen wortwörtlichen Vergleich setze die Metazeichen in eckige Klammern. '[?]' passt zum Beispiel auf das Zeichen '?'.

Beachte, dass das Trennzeichen für Dateinamen (unter Unix '/') für dieses Modul nicht besonders ist. Zur Pfadnamenexpansion siehe das Modul glob (glob verwendet filter(), um Pfadnamensabschnitte abzugleichen). Ebenso sind Dateinamen, die mit einem Punkt beginnen, für dieses Modul nicht besonders und werden von den Mustern * und ? erfasst.

Sofern nicht anders angegeben, beziehen sich „Dateinamenszeichenkette“ und „Musterzeichenkette“ entweder auf str oder auf ISO-8859-1-kodierte bytes-Objekte. Beachte, dass die unten dokumentierten Funktionen es nicht erlauben, ein bytes-Muster mit einem str-Dateinamen zu mischen und umgekehrt.

Beachte schließlich, dass @functools.lru_cache mit einem maxsize von 32768 verwendet wird, um die (typisierten) kompilierten Regex-Muster in den folgenden Funktionen zwischenzuspeichern: fnmatch(), fnmatchcase(), filter(), filterfalse().

fnmatch.fnmatch(name, pat)

Prüft, ob die Dateinamenszeichenkette name auf die Musterzeichenkette pat passt, und gibt True oder False zurück. Beide Parameter werden mit os.path.normcase() hinsichtlich der Groß- und Kleinschreibung normalisiert. Mit fnmatchcase() lässt sich ein Vergleich durchführen, der Groß- und Kleinschreibung unterscheidet, unabhängig davon, ob das für das Betriebssystem üblich ist.

Dieses Beispiel gibt alle Dateinamen im aktuellen Verzeichnis mit der Endung .txt aus:

import fnmatch
import os

for file in os.listdir('.'):
    if fnmatch.fnmatch(file, '*.txt'):
        print(file)
fnmatch.fnmatchcase(name, pat)

Prüft, ob die Dateinamenszeichenkette name auf die Musterzeichenkette pat passt, und gibt True oder False zurück. Der Vergleich unterscheidet Groß- und Kleinschreibung und wendet os.path.normcase() nicht an.

fnmatch.filter(names, pat)

Baut eine Liste aus jenen Elementen des iterierbaren Objekts names von Dateinamenszeichenketten, die auf die Musterzeichenkette pat passen. Das ist dasselbe wie [n for n in names if fnmatch(n, pat)], nur wirksamer umgesetzt.

fnmatch.filterfalse(names, pat)

Baut eine Liste aus jenen Elementen des iterierbaren Objekts names von Dateinamenszeichenketten, die nicht auf die Musterzeichenkette pat passen. Das ist dasselbe wie [n for n in names if not fnmatch(n, pat)], nur wirksamer umgesetzt.

Added in version 3.14.

fnmatch.translate(pat)

Gibt das Muster pat nach Shell-Art in einen regulären Ausdruck umgewandelt zurück, zur Verwendung mit re.prefixmatch(). Das Muster muss ein str sein.

Beispiel:

>>> import fnmatch, re
>>>
>>> regex = fnmatch.translate('*.txt')
>>> regex
'(?s:.*\\.txt)\\z'
>>> reobj = re.compile(regex)
>>> reobj.prefixmatch('foobar.txt')
<re.Match object; span=(0, 10), match='foobar.txt'>

Siehe auch

Modul glob

Pfadexpansion nach Art der Unix-Shell.