PurePath.full_match permite comprobar si una ruta completa coincide con un patrón de estilo glob. Es útil cuando una aplicación necesita validar nombres de archivos, estructuras de carpetas, extensiones o rutas lógicas sin acceder al sistema de archivos. Como analiza el valor completo, evita coincidencias parciales que pueden volver un filtro demasiado permisivo.
En esta guía verás cómo funciona, qué patrones acepta, en qué se diferencia de match, cómo controlar mayúsculas y minúsculas, cómo trabajar con rutas POSIX y Windows y cómo aplicarlo en validadores, uploads, pruebas y pipelines.
Qué hace PurePath.full_match
PurePath representa una ruta de forma lógica. No comprueba si el archivo existe, por lo que resulta ideal para APIs, analizadores, manifiestos, archivos comprimidos, pruebas y datos recibidos de otros sistemas.
from pathlib import PurePath
ruta = PurePath("datos/2026/informe.csv")
print(ruta.full_match("datos/**/*.csv"))
El resultado es verdadero porque el patrón describe toda la ruta. No se abre ninguna carpeta ni se consulta información del disco.
Por qué importa la coincidencia completa
Una verificación como endswith('.csv') confirma la extensión, pero no garantiza que el archivo esté dentro del directorio permitido. Una expresión regular puede hacerlo, aunque normalmente exige más escapes y reglas específicas para cada plataforma. Un patrón glob suele ser más legible.
from pathlib import PurePath
valores = [
PurePath("entrada/clientes.csv"),
PurePath("entrada/2026/ventas.csv"),
PurePath("backup/ventas.csv"),
]
for elemento in valores:
if elemento.full_match("entrada/**/*.csv"):
print("aceptado:", elemento)
Solo se aceptan rutas que cumplen toda la estructura definida. Esto mejora importadores, procesadores de adjuntos, sistemas de compilación y herramientas de consola.
Patrones glob esenciales
Un asterisco simple coincide con caracteres dentro de un componente. El signo de interrogación representa un carácter. Las expresiones entre corchetes describen conjuntos o rangos. El doble asterisco puede atravesar varios niveles de carpetas.
from pathlib import PurePath
ejemplos = [
("logs/app.log", "logs/*.log"),
("img/foto1.png", "img/foto?.png"),
("datos/a.csv", "datos/[ab].csv"),
("src/pkg/modulo.py", "src/**/*.py"),
]
for valor, patron in ejemplos:
print(valor, PurePath(valor).full_match(patron))
Las reglas quedan cercanas a la forma en que una persona describe grupos de archivos y son fáciles de revisar.
Diferencia entre full_match y match
PurePath.match tiene un comportamiento histórico que puede evaluar patrones relativos desde la parte derecha de una ruta. Eso es cómodo para búsquedas flexibles, pero puede sorprender cuando la regla debe validar toda la entrada. full_match expresa una intención más estricta.
from pathlib import PurePath
p = PurePath("proyecto/src/app.py")
print(p.match("src/*.py"))
print(p.full_match("src/*.py"))
print(p.full_match("proyecto/src/*.py"))
Usa full_match cuando el patrón sea un contrato para todo el valor. Usa match cuando busques una coincidencia más flexible o compatibilidad con código anterior.
Sensibilidad a mayúsculas
El argumento opcional case_sensitive permite definir el comportamiento. Si se omite, el valor predeterminado depende de la familia de ruta. Las rutas POSIX normalmente distinguen mayúsculas; las rutas Windows normalmente no.
from pathlib import PurePosixPath
archivo = PurePosixPath("Imagenes/Foto.PNG")
print(archivo.full_match("imagenes/*.png"))
print(archivo.full_match("imagenes/*.png", case_sensitive=False))
Definir esta opción explícitamente evita que las pruebas produzcan resultados diferentes en Linux y Windows.
PurePosixPath y PureWindowsPath
Puedes analizar rutas de otra plataforma sin depender del sistema operativo actual. PurePosixPath entiende barras normales. PureWindowsPath entiende unidades, barras invertidas y convenciones de Windows.
from pathlib import PurePosixPath, PureWindowsPath
web = PurePosixPath("assets/css/site.css")
win = PureWindowsPath(r"C:\Proyectos\app\main.py")
print(web.full_match("assets/**/*.css"))
print(win.full_match(r"C:\Proyectos\**\*.py"))
Esto ayuda al procesar manifiestos remotos, entradas de ZIP, configuraciones y metadatos de compilación.
Validación de uploads
La coincidencia completa puede formar parte de una política de uploads. No sustituye la inspección MIME, los límites de tamaño, el análisis del contenido ni el control seguro del destino, pero restringe ubicaciones lógicas y extensiones.
from pathlib import PurePosixPath
PATRON = "uploads/**/*.csv"
def permitido(valor: str) -> bool:
ruta = PurePosixPath(valor)
return ruta.full_match(PATRON, case_sensitive=False)
También debes rechazar componentes que suban al directorio padre y resolver el destino final con seguridad. Para ampliar el tema, consulta pathlib.Path.walk en Python.
Clasificación en pipelines
Un diccionario de patrones permite clasificar artefactos sin condicionales anidados.
from pathlib import PurePath
REGLAS = {
"entrada": "data/incoming/**/*.json",
"procesado": "data/processed/**/*.parquet",
"log": "logs/**/*.log",
}
def clasificar(valor: str) -> str | None:
ruta = PurePath(valor)
for nombre, patron in REGLAS.items():
if ruta.full_match(patron, case_sensitive=False):
return nombre
return None
Este diseño combina bien con recorridos descritos en os.fwalk en Python y con herramientas empaquetadas mediante zipapp en Python.
Errores comunes
El primer error es olvidar que la coincidencia es completa. Un patrón como *.py puede no describir una ruta con varias carpetas. Incluye el prefijo o usa **/*.py cuando se permitan niveles intermedios.
El segundo error es mezclar separadores y semánticas. Usa la clase de ruta pura correspondiente a los datos analizados.
El tercer error es considerar el glob como una barrera de seguridad completa. Valida la forma de la ruta, no el contenido, los permisos ni el destino real.
Pruebas automatizadas
Las rutas puras permiten pruebas rápidas porque no requieren carpetas temporales.
from pathlib import PurePosixPath
def permitido(valor: str) -> bool:
return PurePosixPath(valor).full_match(
"informes/**/*.csv",
case_sensitive=False,
)
def test_valido():
assert permitido("informes/2026/enero.csv")
def test_extension_invalida():
assert not permitido("informes/2026/enero.exe")
def test_carpeta_invalida():
assert not permitido("privado/enero.csv")
Para contratos más claros, revisa typing.override en Python y dataclasses.KW_ONLY en Python.
Compatibilidad de versiones
Comprueba la versión mínima de Python de tu proyecto antes de adoptar una API reciente. Si debes soportar entornos antiguos, encapsula la operación en una función pequeña y prueba la alternativa por separado.
from pathlib import PurePath
def coincide(ruta: str, patron: str) -> bool:
objeto = PurePath(ruta)
metodo = getattr(objeto, "full_match", None)
if metodo is None:
raise RuntimeError("PurePath.full_match no está disponible")
return metodo(patron)
La documentación oficial de pathlib es la referencia principal. La documentación de fnmatch ayuda a comprender los patrones.
Recomendaciones de diseño
Centraliza los patrones, asígnales nombres según la intención del negocio y añade ejemplos positivos y negativos a las pruebas. Define la sensibilidad a mayúsculas cuando la regla deba ser portátil. Convierte entradas externas a una familia de ruta conocida en lugar de depender de la plataforma anfitriona.
Cuando un patrón sea demasiado amplio, divídelo en varias reglas con nombres claros. Es más fácil auditar varias reglas simples que una expresión compleja. Si la decisión depende de metadatos o contenido, realiza esas verificaciones después del filtro lógico.
Uso en herramientas de línea de comando
Una CLI puede aceptar una lista de rutas y patrones, convertirlos a PurePath y mostrar qué elementos serán procesados antes de ejecutar cambios. Esa vista previa reduce errores humanos. También puedes almacenar los patrones en configuración, validarlos al iniciar y registrar qué regla aceptó cada archivo.
Evita incluir rutas privadas completas en logs públicos. En sistemas multiusuario, registra identificadores o rutas relativas controladas. La claridad del patrón no elimina la necesidad de permisos y aislamiento.
Conclusión
PurePath.full_match ofrece una forma legible de comprobar que una ruta lógica completa sigue un patrón glob. Evita comparaciones frágiles con strings, no accede al disco, permite controlar mayúsculas y funciona con semántica POSIX o Windows.
Úsalo en contratos de rutas, clasificación de artefactos, uploads, sistemas de compilación y filtros multiplataforma. Mantén patrones específicos y combínalos con validaciones de contenido, permisos y destino cuando la entrada no sea confiable.







