2012-04-06 1 views
7

Quale sarebbe il modo più semplice per avere .gitignore style fnmatch() con Python. Sembra che stdlib non fornisca una funzione match() che dovrebbe corrispondere a una specifica di percorso rispetto a un'espressione regolare di percorso UNIX..gitignore style fnmatch()

.gitignore hanno entrambi i percorsi e file con caratteri jolly per essere (nero) elencate

+0

Perché l'espressione regolare non funziona per te? – jdi

+0

Preferisco accettare solo risposte valide. –

+0

Forse faccio domande troppo difficili? :) –

risposta

6

Se si desidera utilizzare caratteri jolly UNIX misti come indicato nel tuo esempio .gitignore, perché non basta prendere ogni modello e utilizzare fnmatch.translate con re.search?

import fnmatch 
import re 

s = '/path/eggs/foo/bar' 
pattern = "eggs/*" 

re.search(fnmatch.translate(pattern), s) 
# <_sre.SRE_Match object at 0x10049e988> 

translate trasforma il modello jolly in un modello re

file

Hidden UNIX:

s = '/path/to/hidden/.file' 
isHiddenFile = re.search(fnmatch.translate('.*'), s) 
if not isHiddenFile: 
    # do something with it 
+0

Purtroppo questo fallisce con un semplice schema fnmatch come. * (Ignora tutti i file nascosti UNIX). –

+0

@MikkoOhtamaa: non sono sicuro di seguirlo. Il mio aggiornamento mostra che abbina correttamente un percorso a un file unix nascosto. – jdi

+0

Ecco spiegato in dettaglio: https://bugs.launchpad.net/bzr/+bug/57637 –

12

Ora c'è una libreria chiamata pathspec che implementa la specifica completa .gitignore, comprese le cose come **/*.py; il documentation non descrive le opzioni in dettaglio, ma dice che è compatibile con git, e lo code le gestisce.

>>> import pathspec 
>>> spec_src = '**/*.pyc' 
>>> spec = pathspec.PathSpec.from_lines(pathspec.patterns.GitWildMatchPattern,, spec_src.splitlines()) 
>>> set(spec.match_files({"test.py", "test.pyc", "deeper/file.pyc", "even/deeper/file.pyc"})) 
set(['test.pyc', 'even/deeper/file.pyc', 'deeper/file.pyc']) 
>>> set(spec.match_tree("pathspec/")) 
set(['__init__.pyc', 'gitignore.pyc', 'util.pyc', 'pattern.pyc', 'tests/__init__.pyc', 'tests/test_gitignore.pyc', 'compat.pyc', 'pathspec.pyc'])