2011-11-08 22 views
5

estoy analizar un registro con pitón y necesitan rápida buscar unos valores de ellagrupo de varias coincidencias para una sola expresión regular

esta es la sencilla expresión regular y ejemplo de uso equivalente

pat = re.compile("(1(2[3456]+2)+1)*") 

No funciona como se esperaba, solo el último grupo coincidente es devuelto por pat.match(). groups()

¿Cuál es la solución más simple para tales problemas?

actualizado (como motor del wiki dice que el uso de edición en lugar de crear nuevos correos):

Necesito partidos repetidos, por supuesto.

to_match="1232112542254211232112322421" 

regex encuentran que debe aplicarse dos veces de forma recursiva. Puedo soportarlo, pero ¿hay alguna opción?

+1

Cambio '*' a '?'. '" (1 (2 [3456] +2) +1)? "' –

+0

posible duplicado de [grupos múltiples de expresiones regulares de Python] (http://stackoverflow.com/questions/4963691/), [captura de grupos de expresiones regulares con múltiples coincidencias] (http://stackoverflow.com/questions/5598340/), [expresiones regulares de Python: ¿Cómo acceder a múltiples coincidencias de un grupo?] (http://stackoverflow.com/questions/5060659/). – outis

Respuesta

1

Ok, prueba este (pero sólo después de que ha aprendido a aceptar respuestas; -))

s = "123321124421125521" 
pat = re.compile("(1(2[3456]+2)+1)") 
print pat.findall(s) 

quitar el cuantificador y usar en su lugar findall(). Esto dará lugar a esta lista:

[('123321', '2332'), ('124421', '2442'), ('125521', '2552')]

1

Está repitiendo un grupo capturado en lugar de capturar un grupo repetido y esa es la razón por la que obtiene solo la última captura.

Debería utilizar

pat = re.compile("((1(2[3456]+2)+1)*)") 

Ver aquí para más información sobre la repetición de un grupo capturado frente a la captura de un grupo repetido http://www.regular-expressions.info/captureall.html

+2

No tiene sentido colocar corchetes alrededor de todo el patrón. La coincidencia de todo el patrón ya está almacenada en '.group (0)'. En su solución '.group (0)' y '.group (1)' son los mismos. – stema

+0

@stema Tienes razón, pero evidentemente OP está mirando 'group (1)' por lo que dice en la pregunta. También existe la posibilidad de que la expresión regular dada aquí sea solo la parte de la expresión regular real que está causando un problema OP y podría haber algo a la izquierda/derecha de la expresión regular dada en cuyo caso 'group (0)' podría no ser Qué se necesita. –

Cuestiones relacionadas