filter strings per regex in einer Liste
Möchte ich das filtern einer Liste von strings in python mithilfe von regex. In dem folgenden Fall, halten Sie nur die Dateien mit der '.npy' Erweiterung.
Den code, der nicht funktioniert:
import re
files = [ '/a/b/c/la_seg_x005_y003.png',
'/a/b/c/la_seg_x005_y003.npy',
'/a/b/c/la_seg_x004_y003.png',
'/a/b/c/la_seg_x004_y003.npy',
'/a/b/c/la_seg_x003_y003.png',
'/a/b/c/la_seg_x003_y003.npy', ]
regex = re.compile(r'_x\d+_y\d+\.npy')
selected_files = filter(regex.match, files)
print(selected_files)
Den gleichen regex funktioniert für mich in Ruby:
selected = files.select { |f| f =~ /_x\d+_y\d+\.npy/ }
Was falsch mit der Python-code?
- Sie wan-zu-filter-Elemente in
files
mit der.npy
- Erweiterung?
Du musst angemeldet sein, um einen Kommentar abzugeben.
re.match('regex')
gleichre.search('^regex')
odertext.startswith('regex')
aber regex-version. Es nur überprüfen, wenn die Zeichenfolge beginnt mit der regex.Also, nutzen Sie
re.search()
statt:Ausgabe:
Und wenn Sie nur wollen, um alle von den
.npy
Dateien, benutzen Sie einfachstr.endswith()
:filter()
akzeptiert diere.search()
-Methode, da die letztere gibt eine InstanzMatchObject
und nicht boolean. Es wird erläutert, hier in 16.8.3: Diesearch()
-Methode gibt eine MatchObject, wenn der Artikel passt undfilter()
interpretiert, als Wahr. Ansonstensearch()
gibt Keine, die als False interpretiert.filter()
gibt einen generator, so müssen Sie wickeln Sie es inlist()
wenn es das ist, was Sie wollen.Verwenden Sie einfach
search
- da Spiel startet, matching von Anfang bis zum Ende (d.h. ganze) von string-und such-Spiele überall in der Zeichenfolge.Ausgabe-
Wenn Sie match, das Muster muss sich auf die gesamte Eingang.
Erweitern Sie den regulären Ausdruck:
Welche würde passen:
Oder verwenden Sie re.Suche, die
re.match()
sieht für ein Spiel auf den Anfang der Zeichenkette. Sie könnenre.search()
statt.