2012-04-06 9 views
7

Cuál sería la forma más simple de tener .gitignore style fnmatch() con Python. Parece que stdlib no proporciona una función de coincidencia() que coincida con una especificación de ruta con una expresión regular de ruta de estilo UNIX..gitignore style fnmatch()

.gitignore tiene ambas rutas y archivos con comodines para ser (negro) en la lista

+0

¿Por qué la expresión regular no funciona para usted? – jdi

+0

Prefiero aceptar solo respuestas válidas. –

+0

¿Quizás hago preguntas demasiado difíciles? :) –

Respuesta

6

Si desea utilizar patrones comodín UNIX mixtos como aparece en el ejemplo .gitignore, ¿por qué no tomar cada patrón y usar fnmatch.translate con 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 convierte el patrón de comodines en un modelo de la re

archivos

Ocultos UNIX:

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

Desafortunadamente, esto falla con un patrón de fnmatch tan simple como. * (Ignorar todos los archivos ocultos de UNIX). –

+0

@MikkoOhtamaa: No estoy seguro de seguir. Mi actualización muestra que coincide adecuadamente con una ruta a un archivo Unix oculto. – jdi

+0

Aquí se explica en detalle: https://bugs.launchpad.net/bzr/+bug/57637 –

12

Ahora hay una biblioteca llamada pathspec que implementa la especificación completa .gitignore, incluyendo cosas como **/*.py; el documentation no describe las opciones en detalle, pero dice que es compatible con git y que las maneja el 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'])