Regex para que coincida con el primer archivo en un archivo de archivo rar establecido en Python

Necesito descomprimir todos los archivos en un directorio y para esto necesito encontrar el primer archivo en el conjunto. Actualmente estoy haciendo esto usando un montón de instrucciones y bucles if. ¿Puedo hacer esto usando expresiones regulares?

Aquí hay una lista de archivos que necesito para coincidir:

yes.rar yes.part1.rar yes.part01.rar yes.part001.rar yes.r01 yes.r001 

Estos NO deben ser emparejados:

 no.part2.rar no.part02.rar no.part002.rar no.part011.rar no.r002 no.r02 

Encontré una expresión regular similar en este hilo, pero parece que Python no admite miradas de longitud variable. Una sola expresión regular sería complicada, pero la documentaré bien y no es un problema. Es solo uno de esos problemas por los que venciste a tu montón.

Gracias de antemano chicos.

🙂

No hay necesidad de usar la mirada detrás de las afirmaciones para esto. Desde que empiezas a mirar desde el principio de la cadena, puedes hacer todo con miradas hacia delante que puedas con miradas hacia atrás. Esto debería funcionar:

 ^((?!\.part(?!0*1\.rar$)\d+\.rar$).)*\.(?:rar|r?0*1)$ 

Para capturar la primera parte del nombre de archivo que solicitó, puede hacer esto:

 ^((?:(?!\.part\d+\.rar$).)*)\.(?:(?:part0*1\.)?rar|r?0*1)$ 

No confíe en los nombres de los archivos para determinar cuál es el primero. Vas a terminar encontrando un caso de borde donde obtienes el archivo incorrecto.

Los encabezados de RAR le dirán qué archivo es el primero en el volumen, asumiendo que se crearon en una versión algo reciente de RAR.

HEAD_FLAGS banderas de bits:
2 bytes

0x0100 – Primer volumen (establecido solo por RAR 3.0 y posterior)

Así que abra cada archivo y examine los encabezados RAR, buscando específicamente la bandera que indica qué archivo es el primer volumen. Esto nunca fallará, siempre y cuando el archivo no esté dañado.


Actualización : acabo de confirmar esto echando un vistazo a algunos archivos extensos en un editor hexadecimal. Los encabezados de los archivos se construyen exactamente como lo indica el enlace anterior. Es solo una cuestión de abrir los archivos y leer el encabezado de esa bandera. El archivo con esa bandera es el primer volumen.

¿Estás seguro de que quieres igualar estos casos?

si.r01

No son los primeros archivos: .rar siempre lo es.

Es bla.rar, bla.r00 y luego solo bla.r01. Probablemente extraerá los archivos dos veces si compara .r01 y .rar como primer archivo.

si.r001

.r001 no existe. ¿Se refiere a los archivos .001 que soporta WinRAR? Después de .r99, es .s00. Si existe, entonces alguien renombró los archivos manualmente.

En teoría, la coincidencia en el nombre de archivo debe ser tan confiable como la coincidencia en el indicador 0x0100 para encontrar el primer archivo.