Как сопоставить пути Python с рекурсивными шаблонами globPython

Программы на Python
Ответить
Anonymous
 Как сопоставить пути Python с рекурсивными шаблонами glob

Сообщение Anonymous »

Я хотел бы отфильтровать список относительных путей в стиле Linux, используя выражения glob, которые могут содержать **.
Например:

Код: Выделить всё

+-- pattern.py
+-- dir_a
|   +-- pattern.py
|   +-- dir_b
|   |   +-- pattern.py
Что я ищу:

Код: Выделить всё

glob_match('*.py', 'pattern.py')                         # -> True
glob_match('*.py', 'dir_a/pattern.py')                   # -> False
glob_match('dir_a/**/*.py', 'dir_a/pattern.py')          # -> True
glob_match('dir_a/*.py', 'dir_a/dir_b/pattern.py')       # -> False
glob_match('dir_a/**/*.py', 'dir_a/dir_b/pattern.py')    # -> True
Если я не ошибаюсь, и pathlib.Path.match, и fnmatch.fnmatch не поддерживают **, а скорее интерпретируют один * как любой символ, включая косую черту, что позволяет второму и четвертому примерам выше давать True.
Я думаю, что могу понять, как это реализовать, но я бы поискал существующую реализацию. можно положиться :)
Спасибо!
Изменить Чтобы уточнить, glob_match, который я ищу, - это бит glob.glob(..., recursive=True), который выполняет сопоставление, без бита, выполняющего сканирование файловой системы. Другими словами, результат glob_match(pattern, rel_path) не должен зависеть от rel_path, указывающего на реальный файл или даже от наличия доступа к файловой системе.
  • временно записать rel_path в файловую систему только для запуска glob_match было бы решением, но я бы предпочел этого не делать
  • Я думал о том, чтобы раскопать реализацию в glob.glob, но поскольку он написан как итератор, это не намного проще, чем написать новый glob_match с нуля...


Подробнее здесь: https://stackoverflow.com/questions/669 ... b-patterns
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»