Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

202
Vistas
¿Cómo puedo hacer que Python vuelva a funcionar como grep para grupos repetidos?

Tengo la siguiente cadena:

 seq = 'MNRYLNRQRLYNMYRNKYRGVMEPMSRMTMDFQGRYMDSQGRMVDPRYYDHYGRMHDYDRYYGRSMFNQGHSMDSQRYGGWMDNPERYMDMSGYQMDMQGRWMDAQGRYNNPFSQMWHSRQGH'

también se guarda en un archivo llamado seq.dat . Si uso el siguiente comando grep

 grep '\([MF]D.\{4,6\}\)\{3,10\}' seq.dat

Obtengo la siguiente cadena coincidente:

 MDNPERYMDMSGYQMDMQGRWMDAQGRYN

que es lo que quiero. En palabras, lo que quiero hacer coincidir es tantas repeticiones consecutivas como la cadena tiene de [MF]D.{4,6} . No quiero hacer coincidir los casos en los que tiene menos de 3 repeticiones consecutivas, pero quiero que pueda capturar hasta 6.

Ahora, estoy tratando de hacer esto con Python. tengo

 p = re.compile("(?:[MF]D.{4,6}){3,10}")

Intentando search() devuelve

 MDNPERYMDMSGYQMDMQGRWM

Es lo más cercano a la respuesta que busco, pero aún falta el último MDAQGRYN . Supongo que esto se debe a que .{4,6} coincide con la M , lo que a su vez evita que {3,10} capture esta cuarta aparición de ([MF]D.{4,6}) , pero como pedí al menos 3, es feliz y se detiene.

¿Cómo hago para que Python regex se comporte como lo hace grep?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Existe una diferencia fundamental entre los motores POSIX ("dirigido por texto") y NFA ("dirigido por expresiones regulares"). Los motores POSIX ( grep aquí usa un tipo de expresión regular POSIX BRE, es el tipo que se usa de forma predeterminada) analizarán el texto de entrada aplicándole la expresión regular y devolverán la coincidencia más larga posible. El motor NFA (el motor Python re es un motor NFA) aquí no se vuelve a consumir (retrocede) cuando las partes del patrón subsiguientes coinciden.

Consulte la referencia sobre motores dirigidos por expresiones regulares y dirigidos por texto :

Un motor dirigido por expresiones regulares recorre la expresión regular, intentando hacer coincidir el siguiente token en la expresión regular con el siguiente carácter. Si se encuentra una coincidencia, el motor avanza a través de la expresión regular y la cadena de asunto. Si un token no coincide, el motor retrocede a una posición anterior en la expresión regular y la cadena de asunto donde puede probar una ruta diferente a través de la expresión regular... Los sabores de expresiones regulares modernos que usan motores dirigidos por expresiones regulares tienen muchas características como la agrupación atómica y cuantificadores posesivos que le permiten controlar este retroceso.

Un motor dirigido por texto recorre la cadena de asunto, intentando todas las permutaciones de la expresión regular antes de avanzar al siguiente carácter de la cadena. Un motor dirigido por texto nunca retrocede. Por lo tanto, no hay mucho que discutir sobre el proceso de coincidencia de un motor dirigido por texto. En la mayoría de los casos, un motor dirigido por texto encuentra las mismas coincidencias que un motor dirigido por expresiones regulares.

La última oración dice "en la mayoría de los casos", pero no en todos los casos, y el suyo es un buen ejemplo de que pueden ocurrir discrepancias.

Para evitar consumir M o F que se siguen inmediatamente con D , sugeriría usar

 (?:[MF]D(?:(?![MF]D).){4,6}){3,10}

Vea la demostración de expresiones regulares . Detalles :

  • (?: - inicio de un grupo de contenedores externo que no captura:
    • [MF]D - M o F y luego D
    • (?:(?![MF]D).){4,6} : cualquier carácter (aparte de un salto de línea) repetido de cuatro a seis veces, que no inicia una secuencia de caracteres MD o FD
  • ){3,10} - final del grupo exterior, repetir de 3 a 10 veces.

Por cierto, si solo desea hacer coincidir las letras ASCII en mayúsculas, reemplace el . con [AZ] .

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda