¿Cómo hacer una “combinación inversa” con la expresión regular?

Estoy usando RegexBuddy pero estoy en problemas de todos modos con esto: \

Estoy procesando línea por línea un archivo. Construí un “modelo de línea” para que coincida con lo que quiero.

Ahora me gustaría hacer una coincidencia inversa … es decir, quiero unir líneas donde hay una cadena de 6 letras, pero solo si estas seis letras no son Andrea , ¿cómo debería hacerlo?


EDITAR: Escribiré el progtwig que usa esta expresión regular, todavía no sé si en python o php, estoy haciendo esto primero para aprender algunos regex 🙂 Hay diferentes tipos de línea, quería usar expresiones regulares para seleccionar el tipo en el que estoy interesado. Una vez que obtuve estas líneas, tengo que aplicar otro filtro solo para que no coincida con un valor conocido, necesito todas las demás, no eso. El (?! No deseado) está funcionando bastante bien, gracias. 🙂

Espero que esto aclare la pregunta 🙂

(?!Andrea).{6} 

Suponiendo que su motor regexp es compatible con lookaheads negativos ..

Editar: … o tal vez prefieras usar [A-Za-z]{6} en lugar de .{6}

Editar (otra vez): tenga en cuenta que los lookaheads y lookbehinds generalmente no son la forma correcta de “invertir” una coincidencia de expresión regular. Las expresiones regulares no están configuradas para hacer coincidencias negativas, sino que las dejan en el idioma que las usa.

Para Python / Java,

 ^(.(?!(some text)))*$ 

http://www.lisnichenko.com/articles/javapython-inverse-regex.html

Actualizado con comentarios de Alan Moore

En PCRE y variantes similares, puedes crear una expresión regular que coincida con cualquier línea que no contenga un valor:

 ^(?:(?!Andrea).)*$ 

Esto se llama token codicioso templado . El inconveniente es que no funciona bien.

Qué idioma estás usando? Las capacidades y la syntax de la implementación de expresiones regulares son importantes para esto.

Puedes usar look-ahead. Usando Python como ejemplo

 import re not_andrea = re.compile('(?!Andrea)\w{6}', re.IGNORECASE) 

Para romper eso:

(?! Andrea) significa ‘coincidencia si los próximos 6 caracteres no son’ Andrea ”; si es así, entonces

\ w significa un “carácter de palabra” – caracteres alfanuméricos. Esto es equivalente a la clase [a-zA-Z0-9_]

\ w {6} significa exactamente 6 caracteres de palabra.

re.IGNORECASE significa que excluirá “Andrea”, “andrea”, “ANDREA” …

Otra forma es usar la lógica de su progtwig: use todas las líneas que no coincidan con Andrea y póngalas en una segunda expresión regular para verificar si hay 6 caracteres. O primero verifique al menos 6 caracteres de palabras, y luego verifique que no coincida con Andrea.

Aserción de búsqueda anticipada negativa

 (?!Andrea) 

Esto no es exactamente una coincidencia invertida, pero es lo mejor que puedes hacer directamente con regex. Sin embargo, no todas las plataformas los admiten.

Si desea hacer esto en RegexBuddy, hay dos formas de obtener una lista de todas las líneas que no coinciden con una expresión regular.

En la barra de herramientas del panel de Prueba, configure el scope de la prueba como “Línea por línea”. Cuando lo haga, aparecerá un elemento Listar todas las líneas sin coincidencias debajo del botón Mostrar todo en la misma barra de herramientas. (Si no ve el botón Mostrar todo, haga clic en el botón Coincidir en la barra de herramientas principal).

En el panel de GREP, puede activar las casillas de verificación “basado en línea” e “invertir resultados” para obtener una lista de líneas que no coinciden en los archivos que está completando.

(?! es útil en la práctica. Aunque estrictamente hablando, mirar hacia el futuro no es una expresión regular como se define matemáticamente.

Puedes escribir una expresión regular invertida manualmente.

Aquí hay un progtwig para calcular el resultado automáticamente. Su resultado es generado por la máquina, que suele ser mucho más complejo que la escritura a mano. Pero el resultado funciona

Acabo de presentar este método que puede ser intensivo en hardware pero funciona:

Puede reemplazar todos los caracteres que coincidan con la expresión regular por una cadena vacía.

Este es un oneliner:

notMatched = re.sub(regex, "", string)

Usé esto porque me vi obligado a usar una expresión regular muy compleja y no pude encontrar la forma de invertir cada parte de ella.

Esto solo te devolverá el resultado de la cadena, ¡no cualquier objeto coincidente!

En Perl puedes hacer

proceso ($ línea) if ($ line = ~! / Andrea /);

Intereting Posts