2012-04-06 14 views
7

Python ile .gitignore style fnmatch() öğesinin sahip olmasının en kolay yolu ne olurdu? Bu stdlib'in, bir UNIX stil yolu regexine karşı bir yol belirtimiyle eşleşecek bir match() işlevi sağlamadığı anlaşılıyor..gitignore style fnmatch()

.gitignore, (siyah) listelenen joker karakterleriyle birlikte hem yolları hem de dosyaları içerir (siyah)

+0

Düzenli ifade neden sizin için çalışmıyor? – jdi

+0

Sadece geçerli cevapları kabul etmeyi tercih ederim. –

+0

Belki çok zor sorular soruyorum? :) –

cevap

6

, neden sadece her desen alıp re.search ile fnmatch.translate kullanılır?

import fnmatch 
import re 

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

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

translate

yeniden kalıba

Gizli UNIX dosya joker desen döner:

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

Ne yazık ki bu, böyle basit bir fnmatch modeliyle başarısız olur. * (Tüm UNIX gizli dosyalarını yoksay). –

+0

@MikkoOhtamaa: Takip ettiğimden emin değilim. Güncellemem, gizli bir unix dosyasına giden bir yolla düzgün şekilde eşleştiğini gösteriyor. – jdi

+0

Burada ayrıntılı olarak açıklanmaktadır: https://bugs.launchpad.net/bzr/+bug/57637 –

12

**/*.py gibi şeyler de dahil olmak üzere tam .gitignore şartname, uygulayan pathspec adında bir kütüphane artık yoktur; documentation, seçenekleri ayrıntılı olarak açıklamıyor, ancak git uyumlu olduğunu ve code'un bunları işlediğini söylüyor.

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