Supongamos que tengo una cadena como la siguiente:Expresión regular para que coincida con el nombre y la función de todos los argumentos en Python
"func(arg1, arg2, arg3, arg4, ..., argn)"
EDIT: Esta función no está en un idioma en particular. Simplemente tiene este formato. Si lo hace más fácil, no lo piense como una llamada a función, solo una cadena.
Quiero escribir una expresión regular para que coincida con la función y cada de los argumentos. Estoy escribiendo esto en Python. La salida deseada de esto es:
{"function" : "func", "arg" : ["arg1", "arg2", ... , "argn"]}
EDIT: Si bien los argumentos podrían ser llamadas a funciones, puedo tratar fácilmente de forma recursiva para que coincida con la misma expresión regular una vez que creo que funciona. Con esto quiero decir que puedo recurrir en la función con cada uno de los argumentos. Pero esto no es realmente relevante. Estoy no tratando de crear un intérprete, solo algo para reconocer los argumentos.
Aquí está mi intento de esto:
import re
s = "func(arg1, arg2, arg3, arg4, argn)"
m = re.match(r"(?P<function>\w+)\s?\((?P<args>(?P<arg>\w+(,\s?)?)+)\)", s)
print m.groupdict()
Y aquí está la salida:
{'function': 'func', 'args': 'arg1, arg2, arg3, arg4, argn', 'arg': 'argn'}
La función coincide muy bien, y lo mismo ocurre con el conjunto argumento. Sin embargo, parece que no puedo unir los argumentos individuales. ¿Esto es un problema con mi expresión regular, o una limitación de la coincidencia de expresiones regulares de Python?
Edit2: Soy consciente de que ahora puedo dividir los argumentos usando el siguiente código:
d["arg"] = d["args"].split(", ")
Pero me preguntaba si podía hacer todo el trabajo con expresiones regulares. En particular, me pregunto por qué "arg" se corresponde con el último argumento.
EDIT3: Supongo que estoy (1) esperando descubrir por qué Python solo coincide con el último argumento cada vez, y (2) si puedo hacer una coincidencia de patrones al estilo de Scheme en Python. O si hay algo tan intuitivo en Python como la coincidencia de patrones estilo Scheme. Miré el módulo ast y su sintaxis es prohibitivamente compleja.
¿Está llamada a esta función en algún idioma en particular? No debe usar una expresión regular para analizar un idioma para el que ya existe un analizador correcto/completo ... – Borealid
No puede hacer esto con expresiones regulares (suponiendo que desea hacer coincidir los argumentos individuales, que a su vez podrían ser llamadas a funciones)) Necesitas un analizador real. Si insiste en escribir el suyo, lea esto: http://effbot.org/zone/simple-iterator-parser.htm – Wes
Es posible que desee verificar [pyparsing] (http://pyparsing.wikispaces.com/) si estás planeando hacer algo más complejo. –