Regex ayuda en grupos que no capturan

Debe ser una duplicación pero parece que no puedo encontrarla …

Estoy usando un grupo para hacer coincidir una subcadena que se repite. Sin embargo, no quiero que el grupo sea capturado. Esto parece ser una contradicción.

Para ser explícitos, supongamos que quiero encontrar cualquier carácter que siga 3 réplicas exactas de todas las cadenas de subconjuntos de capital. por

s = 'hjgABABABfgfBBdqCCCugDDD' | | 

debería volver

 ['f', 'u'] 

Puedo encontrar muy bien las cadenas de repetición y el siguiente carácter por

 import re print(re.findall(r'([AZ]+)\1{2}(.)', s)) 

lo que da

 [('AB', 'f'), ('C', 'u')] 

Puedo analizar fácilmente la lista resultante y obtener solo los 2dos elementos. Pero, ¿hay una manera regular de obtener solo los 2dos elementos para empezar? Si trato de hacer

 print(re.findall(r'(?:[AZ]+)\1{2}(.)', s)) 

yo obtengo

 raise source.error("invalid group reference", len(escape)) sre_constants.error: invalid group reference at position 10 

Apreciaré una breve verificación de que el problema es realmente una colisión entre el requisito de no captura y la captura que se necesita para detectar repeticiones. A continuación, una idea inteligente de cómo lograr el objective claramente.

Related of "Regex ayuda en grupos que no capturan"

La razón por la que esto no funciona es que cuando escribes \1 básicamente dices “el contenido del primer grupo”, que por supuesto no está definido si el grupo no captura.

Como re.findall siempre buscará una lista de tuplas una vez que defina varios grupos de captura en el patrón, no puede usar el enfoque “solo de expresiones regulares” aquí.

Use re.finditer para obtener todos los objetos de datos coincidentes y obtener los contenidos del Grupo 2 solo de cada coincidencia:

 print([x.group(2) for x in re.finditer(r'([AZ]+)\1{2}(.)', s)]) 

Ver la demo de Python