Supponiamo che io sono una stringa come il seguente:un'espressione regolare per trovare il nome della funzione e tutti gli argomenti in Python
"func(arg1, arg2, arg3, arg4, ..., argn)"
EDIT: Questa funzione non è in qualche particolare linguaggio. Ha solo questo formato. Se lo rende più facile, non pensarlo come una chiamata di funzione, solo una stringa.
Voglio scrivere un'espressione regolare per abbinare la funzione e ogni degli argomenti. Sto scrivendo questo in Python. L'uscita desiderata di questo è:
{"function" : "func", "arg" : ["arg1", "arg2", ... , "argn"]}
EDIT: Mentre gli argomenti potrebbero essere chiamate di funzione, posso facilmente ricorsivamente provare a corrispondere con la stessa espressione regolare una volta Creo uno che funziona. Con questo intendo che posso ricorrere alla funzione con ciascuno degli argomenti. Ma questo non è veramente rilevante. Sono non cercando di creare un interprete, solo qualcosa per riconoscere gli argomenti.
Ecco il mio tentativo di questo:
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()
Ed ecco l'output:
{'function': 'func', 'args': 'arg1, arg2, arg3, arg4, argn', 'arg': 'argn'}
La funzione corrisponde bene, e così fa il set argomento. Tuttavia, non riesco a trovare una corrispondenza con gli argomenti individuali. Si tratta di un problema con la mia espressione regolare o una limitazione della corrispondenza delle espressioni regolari in Python?
EDIT2: Sono consapevole del fatto che ora posso dividere gli argomenti utilizzando il seguente codice:
d["arg"] = d["args"].split(", ")
Ma mi chiedevo se avrei potuto fare tutto il lavoro con le espressioni regolari. In particolare, mi chiedo perché "arg" sia abbinato solo all'ultimo argomento.
EDIT3: Credo di essere (1) sperando di capire perché Python corrisponda solo all'ultimo argomento ogni volta, e (2) se posso fare lo schema modello in Python. O se c'è qualcosa di altrettanto intuitivo in Python come pattern matching in stile Scheme. Ho guardato il modulo ast e la sua sintassi è proibitivamente complessa.
Questa chiamata di funzione è in una lingua particolare? Non dovresti usare un'espressione regolare per analizzare una lingua per la quale esiste già un parser corretto/completo ... – Borealid
Non puoi farlo con le espressioni regolari (assumendo che tu voglia abbinare i singoli argomenti, che potrebbero essere chiamate di funzione). Hai bisogno di un parser vero e proprio. Se insisti a scrivere il tuo, allora leggi questo: http://effbot.org/zone/simple-iterator-parser.htm – Wes
Potresti voler controllare [pyparsing] (http://pyparsing.wikispaces.com/) se stai pensando di fare qualcosa di più complesso. –