2017-02-27 5 views
1

Ich versuche, nach einem bestimmten Muster zu suchen, um nur diejenigen Dateien zu erfassen, die mit dem Muster in einem bestimmten Ordner übereinstimmen. Ich brauche etwas Hilfe, um einen regulären Ausdruck zu entwickeln, der zwei Mustern entspricht - ich kann nicht eins finden, das zu beiden passt. Dies ist der ursprüngliche reguläre Ausdruck i verwendet:regulärer Ausdruck python - catch filenames

r"^([a-zA-Z]+)__?(\d+).(\d+).(\d+)\.xlsx" 

Der Grund für diese Suchmuster ist, dass ich den Namen extrahiert, Datum (dd-mm-yy) und Full-Dateinamen in fünf Variablen, diese ermöglicht es mir, das Datum zu extrahieren, das in dem vollständigen Dateinamen enthalten ist, der sich auf das Eingabedatum der Datei bezieht.

for name, day, month, year, fullfilename in files 

Jetzt versuche ich, die folgenden:

files = [] 
for f in os.listdir(drive): 
    match = re.search(r"^([a-zA-Z-]+)__?(\d+).(\d+).(\d+).xlsx$",f) 
    if match: 
     files.append(match.groups() + (f,)) 

Beispieldateinamen:

filename_19.01.17.xlsx 
filename__04.01.17.xlsx 
AB_TEST_DATA-OUTER_13.02.17.xlsx 

So sollte die Extraktion folgende sein:

filename, 19, 01, 17, filename_19.01.17.xlsx 

versuchte auch folgende :

Ist es möglich, ein Muster zu haben, das mit allen Dateien übereinstimmt? Oder sollte ich sie in zwei Muster teilen?

+0

Könnte eine dumme Frage sein, aber was ist falsch mit einem einfachen '". * \. Xlsx "'? Gibt es andere xlsx-Dateien in diesem Verzeichnis, die Sie nicht möchten? – Bahrom

+0

@Bahrom ja es gibt, die ich nicht übereinstimmen möchte – OAK

Antwort

1

Das Muster hier scheint zu sein, wie:

Erstens einige Alphabete, durch eine oder mehrere Unter-Noten gefolgt, die die ein Datum im Format von xx.xx.xx und das .xlsx Format am Ende, kann übersetzt werden regex als:

\S+_+(\d+.){3}\.xlsx 

Break-Up:

\ S + - alle nicht-Leerzeichen entspricht, ein oder mehr mal.

_ + - passt ein oder mehrere Male zu wenig.

(\ d +.) {3} - Nummer im Format xx.xx.xx.

.xlsx - entspricht der Dateierweiterung.

+0

das funktioniert wie ein Volltreffer, groß! aber ich ändere die Einzelheiten, siehe oben. Ich möchte im Wesentlichen Gruppen haben. – OAK

1

Sie könnten gehen:

^.+__?(\d{2})\.(\d{2})\.(\d{2})\.xlsx$ 

Gegliedert bedeutet dies:

^   # start of the string 
.+  # anything up to the end, giving up as needed 
__?  # one or two underscores 
(\d{2})\. # exactly two digits, followed by a dot 
(\d{2})\. 
(\d{2})\. 
xlsx  # "xlsx" literally 
$   # the end 

a demo on regex101.com See. Schauen Sie sich auch glob() an.

+0

das hat nicht für mich funktioniert. – OAK

+0

@OAK: Was genau hat hier nicht funktioniert? – Jan