2012-04-06 21 views
7

Cách đơn giản nhất để có fnmatch .gitignore style() với Python. Dường như stdlib không cung cấp một hàm match(), nó sẽ khớp với một đặc tả đường dẫn đối với một regex đường dẫn kiểu UNIX..gitignore style fnmatch()

.gitignore có cả đường dẫn và tệp có ký tự đại diện thành (màu đen) được liệt kê

+0

Tại sao cụm từ thông dụng không hoạt động cho bạn? – jdi

+0

Tôi chỉ muốn chấp nhận câu trả lời hợp lệ. –

+0

Có lẽ tôi đặt câu hỏi quá khó? :) –

Trả lời

6

Nếu bạn muốn sử dụng các mẫu ký tự đại diện hỗn hợp UNIX như được liệt kê trong ví dụ .gitignore của bạn, tại sao không chỉ mất mỗi mẫu và sử dụng fnmatch.translate với 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 biến các mẫu ký tự đại diện vào một mô hình tái

file

Hidden UNIX:

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

Thật không may điều này không thành công với một mô hình fnmatch đơn giản như thế. * (Bỏ qua tất cả các tệp ẩn UNIX). –

+0

@MikkoOhtamaa: Tôi không chắc chắn tôi làm theo. Cập nhật của tôi cho thấy rằng nó phù hợp với một đường dẫn đến một tập tin unix ẩn. – jdi

+0

Dưới đây là giải thích chi tiết: https://bugs.launchpad.net/bzr/+bug/57637 –

12

Có bây giờ là một thư viện gọi pathspec mà thực hiện đầy đủ .gitignore đặc điểm kỹ thuật, bao gồm những thứ như **/*.py; các documentation không mô tả các tùy chọn chi tiết nhưng nói rằng nó là git tương thích, và các code xử lý chúng.

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