2012-10-23 8 views
19
import glob 

list = glob.glob(r'*abc*.txt') + glob.glob(r'*123*.txt') + glob.glob(r'*a1b*.txt') 

for i in list: 
    print i 

Questo codice sta lavorando per elencare i file nella cartella corrente che hanno 'abc' '123' o 'a1b' nei loro nomi. Come utilizzare un glob per realizzare questa funzione, grazieespressione regolare utilizzando in glob.glob di python

+1

"come"? come? –

+0

Non penso che tu possa. python's glob non supporta '{}' e penso che sia praticamente l'unico modo per farlo. – mgilson

risposta

28

Il modo più semplice sarebbe quello di filtrare i risultati glob. Ecco come farlo con una semplice comprensione del ciclo:

import glob 
res = [f for f in glob.glob("*.txt") if "abc" in f or "123" in f or "a1b" in f] 
for f in res: 
    print f 

Si potrebbe anche usare un'espressione regolare e nessun glob:

import os 
import re 
res = [f for f in os.listdir(path) if re.search(r'(abc|123|a1b).*\.txt$', f)] 
for f in res: 
    print f 

(A proposito, nominando una variabile list è una cattiva idea in quanto list è un tipo Python ...)

+2

Penso che intendessi "o" invece di "e", vero? – Emmanuel

+0

@Emmanuel Non sono sicuro ... OP ha scritto su "file che hanno 'abc', '123' * e * 'a1b' in thir. 'Ma guardando il suo codice sto indovinando' o' sarebbe in realtà essere una scelta migliore.Grazie per averlo indicato. – Schnouki

+0

sì, deve essere 'o' qui :) scusami per il mio povero inglese .. – user1561868

10

Ecco un modo pronto per l'uso, basato sulle altre risposte. Non è il massimo delle prestazioni, ma funziona come descritto;

def reglob(path, exp, invert=False): 
    """glob.glob() style searching which uses regex 

    :param exp: Regex expression for filename 
    :param invert: Invert match to non matching files 
    """ 

    m = re.compile(exp) 

    if invert is False: 
     res = [f for f in os.listdir(path) if m.search(f)] 
    else: 
     res = [f for f in os.listdir(path) if not m.search(f)] 

    res = map(lambda x: "%s/%s" % (path, x,), res) 
    return res 
+0

Dovresti usare 'match' per abbinare completamente i nomi.Tenendo il numero – holdenweb

0
for filename in glob.iglob(path_to_directory + "*.txt"): 
    if filename.find("abc") != -1 or filename.find("123") != -1 or filename.find("a1b") != -1: 
     print filename 
+1

Puoi aggiungere alcune spiegazioni alla tua risposta? – kvorobiev

+0

L'idea è fondamentalmente quella di scorrere l'elenco dei nomi dei file nella directory e trovare quelli che hanno uno qualsiasi del testo stringhe nel loro nome –

+0

in c come vuoi che i file che contengono tutte le stringhe nel loro nome, devi solo cambiare "o" in "e" –