¿Hay alguna manera de determinar cuántos grupos de captura hay en una expresión regular dada?Descubre el número de grupos de captura en las expresiones regulares de Python
Me gustaría ser capaz de hacer lo siguientes aparatos:
def groups(regexp, s):
""" Returns the first result of re.findall, or an empty default
>>> groups(r'(\d)(\d)(\d)', '123')
('1', '2', '3')
>>> groups(r'(\d)(\d)(\d)', 'abc')
('', '', '')
"""
import re
m = re.search(regexp, s)
if m:
return m.groups()
return ('',) * num_of_groups(regexp)
Esto me permite hacer cosas como:
first, last, phone = groups(r'(\w+) (\w+) ([\d\-]+)', 'John Doe 555-3456')
Sin embargo, no sé cómo implementar num_of_groups
. (Actualmente sólo trabajo a su alrededor.)
EDIT: Después de laadvice from rslite, he sustituido re.findall
con re.search
.
sre_parse
parece la solución más robusta y completa, pero requiere un recorrido de árbol y parece ser un poco pesado.
La expresión regular de MizardX parece cubrir todas las bases, así que voy a ir con eso.
Esto no devolverá la cantidad de grupos, devolverá una tupla de todos los grupos. Para devolver el número de grupos, necesitará el siguiente código (en Python 3.4): 'return len (re.compile (regex) .groups())' –
@RaziShaban 're.compile (regex) .groups 'es una propiedad de tipo' int'. 're.compile (regex) .match (input) .groups()' es un método que devuelve 'tuple'. –
bien, lo siento, estaba trabajando con Findall, no compilar. El punto que estaba haciendo es que su función se llama 'num_groups' pero devuelve una tupla, no un número. –