.gitignore стиль fnmatch()

Каким был бы самый простой способ получить стиль .gitignore fnmatch() с Python. Похоже, что stdlib не предоставляет функцию match(), которая сопоставляла бы спецификацию пути с регулярным выражением пути в стиле UNIX.

.gitignore имеют как пути, так и файлы с подстановочными знаками, которые должны быть (черными) в списке


person Mikko Ohtamaa    schedule 06.04.2012    source источник
comment
Почему у вас не работают регулярные выражения?   -  person jdi    schedule 07.04.2012
comment
Я предпочитаю принимать только действительные ответы.   -  person Mikko Ohtamaa    schedule 07.04.2012
comment
Может я слишком сложные вопросы задаю? :)   -  person Mikko Ohtamaa    schedule 07.04.2012
comment
Я думаю, вы могли бы смотреть на это таким образом, или просто иметь нереалистичные ожидания. Некоторые из ваших вопросов получают хорошую активность, некоторые нет. И у вас также были проголосованные или закрытые; Смешанная сумка на самом деле. Это действительно мотивирует людей реагировать на ваши вопросы в этом сообществе, когда они знают, что вы тот человек, которому можно помочь. Какой смысл пытаться предложить ответы, если вас ничего не удовлетворит?   -  person jdi    schedule 07.04.2012
comment
Пример реализации GPL2 найден здесь: bazaar.launchpad.net/~bzr-pqm/bzr/bzr.dev/view/head:/bzrlib/   -  person Mikko Ohtamaa    schedule 07.04.2012
comment
Я не ищу развлечений или кармы, я ищу ответы. Правильные ответы будут приняты, и я надеюсь, что люди будут готовы к этому еще до того, как попытаются, так что мне не нужно бессовестно минусовать плохие/неправильные ответы. Хорошие ответы = хорошая карма :)   -  person Mikko Ohtamaa    schedule 07.04.2012
comment
@MikkoOhtamaa Рассмотрите возможность изменения принятого ответа ..   -  person wim    schedule 14.09.2018


Ответы (2)


Если вы хотите использовать смешанные шаблоны подстановочных знаков UNIX, как указано в вашем примере .gitignore, почему бы просто не взять каждый шаблон и не использовать fnmatch.translate с 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 превращает подстановочный шаблон в повторный шаблон

Скрытые файлы UNIX:

s = '/path/to/hidden/.file'
isHiddenFile = re.search(fnmatch.translate('.*'), s)
if not isHiddenFile:
    # do something with it
person jdi    schedule 06.04.2012
comment
К сожалению, это не работает с таким простым шаблоном fnmatch, как .* (игнорировать все скрытые файлы UNIX). - person Mikko Ohtamaa; 07.04.2012
comment
@MikkoOhtamaa: я не уверен, что понимаю. Мое обновление показывает, что оно правильно соответствует пути к скрытому файлу unix. - person jdi; 07.04.2012
comment
@MikkoOhtamaa: Да, я сдаюсь. Я не понимаю корреляции. Удачи! - person jdi; 07.04.2012
comment
Но вы были на правильном пути - ошибка больше похожа на более глубокую проблему с самой Python fnmatch(). Я отмечу это как закрытое и оставлю эту ссылку для будущих поколений на github.com/ miohtama/vvv/tree/master/vvv/bzrlib в качестве решения. - person Mikko Ohtamaa; 07.04.2012

Существует библиотека под названием pathspec, которая реализует полную спецификацию .gitignore, включая такие вещи, как **/*.py; документация описывает, как обрабатывать сопоставление шаблонов Git (вы можете см. также код).

>>> 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'])
person David Fraser    schedule 28.02.2014