2012-04-06 10 views
7

Jaki byłby najprostszy sposób, aby mieć .gitignore style fnmatch() z Pythonem. Wygląda na to, że stdlib nie udostępnia funkcji match(), która pasowałaby do specyfikacji ścieżki względem regex ścieżki stylu UNIX..gitignore style fnmatch()

.gitignore zawiera zarówno ścieżki, jak i pliki z symbolami wieloznacznymi, które mają być (czarne) wymienione na

+0

Dlaczego wyrażenie regularne nie działa? – jdi

+0

Wolę akceptować tylko prawidłowe odpowiedzi. –

+0

Może zadaję zbyt trudne pytania? :) –

Odpowiedz

6

Jeśli chcesz używać symboli wieloznacznych UNIX mieszane wymienionych w .gitignore przykład, dlaczego nie wystarczy wziąć każdy wzór i używać fnmatch.translate z 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 zamienia wzór wieloznacznego do wzorca ponownego

pliki

Ukryte UNIX:

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

Niestety nie udaje się to z takim prostym wzorem fnmatch jak. * (Zignoruj ​​wszystkie ukryte pliki UNIX). –

+0

@MikkoOhtamaa: Nie jestem pewien, czy podążam. Moja aktualizacja pokazuje, że poprawnie pasuje do ścieżki do ukrytego pliku uniksowego. – jdi

+0

Tutaj wyjaśniono szczegółowo: https://bugs.launchpad.net/bzr/+bug/57637 –

12

Jest teraz biblioteka nazywa pathspec który implementuje pełen .gitignore specyfikację, w tym takie rzeczy jak **/*.py; documentation nie opisuje szczegółowo opcji, ale mówi, że jest kompatybilny z git i obsługuje je code.

>>> 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'])