2016-06-16 10 views
0

Ich habe eine Liste von Dateinamen in meinem aktuellen Arbeitsverzeichnis.Regulärer Ausdruck und Mustererkennung in LIST

my_list = ["apple.txt","mango.txt", "grapes.txt","draw.png" , "hello123.txt" , "figure.png"] 

Nun würde Ich mag eine neue Liste erstellen, die nur *.txt Dateien speichern:

new_list = ["apple.txt","mango.txt", "grapes.txt", "hello123.txt"] 

Gibt es eine Möglichkeit, dies mit regulären Ausdrücken und Pattern-Matching in Python zu erreichen.

+1

Pattern Matching und regex sind eher hier irrelevant. –

Antwort

2

Methode 1 mit regex.

import re 
txt_regex = re.compile(r'(\w+.txt)') 
my_list = ["apple.txt","mango.txt", "grapes.txt","draw.png" , "hello123.txt" , "figure.png"] 
result = [i for i in my_list if txt_regex.match(i)] 

Demo von Regex.

Methode 2 mit os

from os.path import splitext 
result = [i for i in my_list if splitext(i)[1] == '.txt'] 

Methode 3 mit split

result = [i for i in my_list if i.split('.')[1] in '.txt'] 

Ouput

['apple.txt', 'mango.txt', 'grapes.txt', 'hello123.txt'] 
3

Sie können diese verwenden:

new_list = [name for name in my_list if name.endswith('.txt')] 
1

Sie können dies auch versuchen:

new_list = [] 
for file in my_list: 
    if file.endswith(".txt"): 
     new_list.append(file) 
print(new_list) 

Ausgabe

['apple.txt', 'mango.txt', 'grapes.txt', 'hello123.txt'] 

UPDATE:

Sie können auch Gruppe alle Dateien einen defaultdict verwenden, wie folgt aus:

from collections import defaultdict 

d = defaultdict(list) 
for file in my_list: 
    key = "." + file.split(".")[1] 
    d[key].append(file) 
print(d) 

Ausgabe:

defaultdict(<class 'list'>, {'.txt': ['apple.txt', 'mango.txt', 'grapes.txt', 'hello123.txt'], '.png': ['draw.png', 'figure.png']}) 

Oder sogar mit einem defaultdict:

d = {} 
for file in my_list: 
    key = "." + file.split(".")[1] 
    if key not in d: 
     d[key] = [] 
    d[key].append(file) 
print(d) 

Ausgang:

{'.txt': ['apple.txt', 'mango.txt', 'grapes.txt', 'hello123.txt'], '.png': ['draw.png', 'figure.png']} 
+0

Dies ist nur fangen, wenn es eine Erweiterung der Länge 3 haben. –

+0

aber '.txt' ist eine Länge von 4, was das OP wollte. – RoadRunner

+0

Ich meine, wenn eine Erweiterung '.docx' diese Methode nicht funktioniert. Mein Punkt ist, dass es eine harte Codierungsmethode ist. –