2009-11-23 23 views
8

Estoy tratando de encontrar una expresión regular que coincida con cualquier cadena que no comience con mpeg. Una generalización de esto es hacer coincidir cualquier cadena que no comience con una expresión regular determinada.Expresión regular que coincide con todo excepto con una expresión regular dada

he intentado algo así como de la siguiente manera:

[^m][^p][^e][^g].* 

El problema con esto es que requiere al menos 4 caracteres a estar presentes en la cadena. No pude encontrar una buena manera de manejar esto y una forma generalizada de manejar esto de manera general.

Voy a usar esto en Python.

+2

Si usted tiene una expresión regular que coincide con todo lo que no quiere, y no coincide con todo lo que quiere , ¿por qué no usar 'not'? –

+3

¿Por qué esta wiki de la comunidad? –

+0

Oh, no creo entender el propósito de la wiki de la comunidad. Así que seleccioné la casilla de verificación por error. –

Respuesta

22
^(?!mpeg).* 

Este utiliza un búsqueda negativa hacia delante para solo una cadena en la que el principio doesn' t coincide con mpeg. Básicamente, requiere que "la posición al comienzo de la cadena no sea una posición en la que si comenzamos a coincidir con la expresión regular mpeg, podríamos coincidir con éxito", haciendo coincidir todo lo que no comience con mpeg y no coincida con nada que lo haga .

Sin embargo, tengo curiosidad acerca del contexto en el que se está utilizando esto - no podría haber otras opciones aparte de expresiones regulares que serían ya sea más eficiente o más legible, como ...

if not inputstring.startswith("mpeg"): 
+0

+1 tanto para responder la pregunta como para proporcionar una (probablemente) mejor alternativa. –

+0

Un usuario introduce la expresión regular a través de una interfaz web. Así que no estoy escribiendo la expresión regular en el programa Python. La expresión regular es una especie de configuración de filtro para una carpeta de vigilancia desde la cual mi software recoge archivos. el usuario usa la interfaz de usuario para completar la expresión regular. Mi código python toma esta expresión regular como criterio de filtrado y recoge los archivos apropiados de la carpeta del reloj. Gracias por la respuesta. –

+0

O incluso 'if not inputstring.startswith ('mpeg')' – Paul

2

Pruebe un look-ahead assertion:

(?!mpeg)^.* 

O si desea utilizar las clases negados solamente:

^(.{0,3}$|[^m]|m([^p]|p([^e]|e([^g])))).*$ 
+0

su expresión regular "clase negada" no funcionará. revisa tu sintaxis –

+0

@ J-16 SDiZ: ¿Por qué piensas eso? – Gumbo

+0

Probablemente porque cree que está tratando de "no coincidir" con el mpeg antes del comienzo de la cadena. A pesar de que es perfectamente legal ya que^es un ancla de ancho cero, tiene razón, ya que parece confuso. –

8

no te vuelvas loco con regex.

if len(mystring) >=4 and mystring[:4]=="mpeg": 
    print "do something" 

o uso startswith() con "no" palabra clave

if len(mystring)>=4 and not mystring.startswith("mpeg") 
+5

Tenga en cuenta que en realidad no necesita la verificación 'len()' - puede cortar cadenas más allá de sus límites, solo obtendrá menos caracteres. – Amber

+0

sí, lo sé. solo que tal vez malinterpreté el requisito de OP. Él dijo "requiere al menos 4 caracteres para estar presente en la cadena". La palabra clave es "en la cadena". Puede ser una cadena larga y puede tener ese requisito también. De todos modos, depende de OP ahora para hacerlo bien. – ghostdog74

+0

Creo que ese fragmento decía que su intento original de expresión regular requería 4 caracteres en la cadena, cuando en realidad quería hacer coincidir algo que no comenzaba con "mpeg", incluso si tenía menos de 4 caracteres. – Amber

0

Su expresión regular no coincidiría "npeg", creo que tendría que llegar a ^($|[^m]|m($|[^p]|p($|[^e]|e($|[^g])))), que es bastante horrible. Otra alternativa sería ^(.{0,3}$|[^m]|.[^p]|..[^e]|...[^g]) que es solo un poco mejor.

Así que creo que realmente debe utilizar una afirmación de preanálisis según lo sugerido por Dav y Gumbo :-)

+0

Su alternativa no es una alternativa ya que no es correcta. No coincidiría * npeg *. – Gumbo

+0

¿Lo intentó? re.match (r "^ (. {0,3} $ | [^ m] |. [^ p] | .. [^ e] | ... [^ g])", "npeg" devuelve un Objeto de coincidencia Funciona porque [^ m] pasa. –

Cuestiones relacionadas