Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

317
Visualizações
¿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 Respostas
Responde à pergunta

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 utilizan 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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda