es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Revisa el número exacto de repeticiones consecutivas con un regex.

Con regex solamente, ¿cómo se puede encontrar un número exacto de repeticiones consecutivas de un símbolo único arbitrario? Por ejemplo, encontrar la cadena “aaa” en “ttaaabbb” en vez de “aaaa” en “ttaaaabbb”, cuando se desea que la cadena tenga 3 repeticiones.

Aclaración: Note que usé “a” como ejemplo, el símbolo puede ser cualquier carácter/número/símbolo arbitrario. Es decir, si se desea encontrar una cadena con 3 repeticiones, se busca la cadena “aaaa!!!cccc333” y se encuentran solamente “!!!” y “333”.

En resumen, busco una lista de símbolos “X” donde la cadena YXXXY aparece en la cadena dada (donde Y es cualquier otro símbolo diferente de X, Y también puede ser el inicio o final de la cadena). Note que puede haber símbolos repetidos en la lista, por ejemplo, “aaabbbbbaaa” debería dar como resultado [“a”, “a”].

Algunos otros ejemplos:

Input: “aaabbbbaaaccc”, output: [“a”, “a”, “c”]
Input: “!!!
aaabbbccc!!!”, output: [“!”, “a”, “b”, “c”, “!”].

Lo que he intentado: He intentado con “(.)\1{2}”, pero desafortunadamente, también encuentra “aaaa” y “ccccc” en el ejemplo anterior. Luego traté con “(?!\1)(.)\1{2}(?!\1)”, donde el prefijo y sufijo del patrón repetido difieren de este. Sin embargo, obtuve un error en este caso, ya que el primer “\1” no está definido al referirse a él.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para encontrar un número exacto de repeticiones consecutivas de un token único arbitrario utilizando regex, puedes utilizar el siguiente patrón:

    (.)(?:\1{2})(?!\1)
    

    Aquí, . coincide con cualquier token único, \1 coincide con el mismo token que el coincidido por el primer grupo y (?:\1{2}) coincide con exactamente dos repeticiones consecutivas de ese token. El grupo (?:) es un grupo no capturador. Finalmente, (?!\1) establece que el siguiente token no es igual al coincidente con el primer grupo, de modo que sólo coincidimos con el número deseado de repeticiones consecutivas.

    Para obtener una lista de todos los tokens que coinciden con este patrón, puedes utilizar el método findall del módulo re de Python:

    import re
    
    string = "aaaabbbbcccc1111dddd"
    
    matches = re.findall(r'(.)(?:\1{2})(?!\1)', string)
    print(matches) # Salida: ['a', 'c']
    

    Esto encontrará cualquier coincidencia del patrón deseado en la cadena y las devolverá como una lista de tokens. Ten en cuenta que si hay múltiples coincidencias del mismo token, todas se incluirán en la lista. Por ejemplo, en la cadena anterior, hay dos coincidencias de ‘a’, por lo que la lista incluye dos ‘a’.

Comments are closed.