2012-07-10 18 views
5

¿Hay alguna forma de combinar grupos y las * características de expresiones regulares para actuar como un tipo de tokenizador/divisor. He intentado esto:¿Pueden los grupos Regex y * comodines trabajar juntos?

my_str = "foofoofoofoo" 
pattern = "(foo)*" 
result = re.search(pattern, my_str) 

que estaba esperando mis grupos podrían parecerse a

("foo", "foo", "foo", "foo") 

Pero no es así. Me sorprendió esto porque? y las características del grupo trabajan juntos:

my_str= "Mr foo" 
pattern = "(Mr)? foo" 
result = re.search(pattern, my_str) 
+3

dudo que quiere trabajar, pero se puede obtener lo que desea el uso de 're.findall (" foo "," foofoofoofoo ")'. Ah, y por favor no use 'str' como nombre de variable. –

+0

Cambié 'str' a' my_str' ya que 'str' sombrea el built-in. – jamylak

+0

ja, lo siento, str fue solo un ejemplo. Ese código probablemente no es sintácticamente correcto. Además, vi el método final y eso definitivamente funcionaría. Solo tenía curiosidad en un sentido más general. –

Respuesta

4

El problema es repite su único grupo de captura. Eso significa que solo tiene un paréntesis ==> un grupo de captura, y este grupo de captura se sobrescribe cada vez que coincide.

Consulte Repeating a Capturing Group vs. Capturing a Repeated Group en regular-expression.info para obtener más información. (Pero capturar un grupo repetido tampoco es lo que quiere)

Por lo tanto, una vez que haya terminado su expresión regular, su grupo de captura 1 contendrá el último "foo" encontrado.

Esto haría que le dará el resultado esperado:

my_str = "foofoofoofoo" 
pattern = "foo" 
result = re.findall(pattern, my_str) 

resultado es entonces una lista ['foo', 'foo', 'foo', 'foo']

+0

+1 para el enlace muy útil. ¡Gracias! –

+0

interesante. Gracias. –

3

grupos de captura y * no funcionan con el construido en el módulo re - usar findall lugar.

Hay una biblioteca llamada regex en pypi que creo que admite esa sintaxis y tiene algunas otras características, como el seguimiento de longitud variable.

+0

Eso explicaría las cosas. Gracias. –

Cuestiones relacionadas