¿Patrón de expresiones regulares que no coincide con ciertas extensiones?

Tengo este patrón escrito

^.*\.(?!jpg$|png$).+$ 

Sin embargo, hay un problema: este patrón coincide con file.name.jpg (2 puntos)

Funciona correctamente (no coincide) en filename.jpg. Estoy tratando de averiguar cómo hacer que no coincida con CUALQUIER archivo .jpg, incluso si el nombre del archivo tiene 2 o más puntos. Intenté usar una vista atrás, pero Python se queja de no usar un ancho fijo (lo cual no estoy muy seguro de lo que eso significa, pero el nombre del archivo será de longitud variable).

Esto debería funcionar: ^.*\.(?!jpg$|png$)[^.]+$

Use las ingeniosas funciones de os.path para dividir correctamente la ruta de archivo en componentes para un análisis más fácil:

 filepath, filename = os.path.split(str) basename, extension = os.path.splitext(filename) if exension[1:] in ['jpg', 'png']: # The extension matches 

Prueba esta expresión regular (no lo hagas. Hace exactamente lo contrario de lo que quieres hacer):

 \.(jpg|png)([^\.]|$) 

Si solo te importa que la cadena no termine con .jpg o .png , puedes usar esto:

 ^.+$(? 

El ^.+ No es estrictamente necesario, pero dependiendo de cómo esté codificado el analizador JSON, es posible que deba forzar a la expresión regular a consumir toda la cadena. Si también está utilizando la expresión regular para otras validaciones, es posible que desee algo más detallado, como:

 ^\w+(?:\.\w+)+$(? 

Probablemente intentaste usar (? , lo cual no funcionaría porque el sabor de expresión regular de Python es uno de los más restrictivos cuando se trata de mirar. PHP y Ruby 1.9+ lo aceptarían porque cada una de las alternativas tiene una longitud fija. Ni siquiera tienen que ser de la misma longitud; (? también funcionaría. Simplemente no intentes factorizar el punto, como en (? ; la alternancia tiene que estar en el nivel superior de la mirada detrás.

Java aceptaría la versión descifrada porque realiza un poco más de trabajo en el momento de la comstackción para determinar el número máximo de caracteres que el aspecto que se necesita para emparejar. Sin embargo, la expresión de lookbe debe ser bastante simple y no puede usar los cuantificadores + o * . Finalmente, los sabores de .NET y JGSoft no colocan restricciones en absoluto en el aspecto. Pero Python hace un bash muy simple de averiguar la cantidad exacta de caracteres que la apariencia necesita para coincidir, generando ese mensaje de error críptico cuando falla.

Parece que casi lo tienes:

 .*\.(?!jpg$|png$)[^.]+ 

Según mis pruebas (en java) obtengo estos resultados:

 file.jpg - false file.png - false file.name.jpg - false file.name.png - false file.gif - true file.name.gif - true file.jpg.gif - true file.jpge - true 

Si esto no es lo que deseaba, actualice su pregunta con sus expectativas.

Por favor, inténtalo

     . * \. (jpg $ | png $)

Coincidirá correctamente en nombre de archivo.jpg. su bash de averiguar cómo hacer coincidir CUALQUIER archivo .jpg, incluso si el nombre del archivo tiene 2 o más puntos, funcionará bien.
Mientras usa el script de Python, asegúrese de estar usando el tipo correcto de división. los diferentes tipos de división viz rsplit (división derecha) y lsplit (división izquierda).