次のような文字列があるとします。
"func(arg1, arg2, arg3, arg4, ..., argn)"
編集:この関数は特定の言語ではありません。このフォーマットだけです。それが簡単になる場合は、それを関数呼び出しとしてではなく、単なる文字列と考えてください。
関数と各引数に一致する正規表現を記述したいと思います。私はこれをPythonで書いています。これの望ましい出力は次のとおりです。
{"function" : "func", "arg" : ["arg1", "arg2", ... , "argn"]}
編集:引数は関数呼び出しである可能性がありますが、機能する正規表現を作成すると、同じ正規表現と簡単に再帰的に一致させることができます。これは、各引数を使用して関数を繰り返すことができることを意味します。しかし、これは実際には関係ありません。私はインタプリタを作成しようとしているのではなく、引数を認識するためのものです。
これが私の試みです:
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()
そしてここに出力があります:
{'function': 'func', 'args': 'arg1, arg2, arg3, arg4, argn', 'arg': 'argn'}
関数はうまく一致し、引数セットも同様に一致します。しかし、私は個々の議論に一致するようには思えません。これは私の正規表現の問題ですか、それともPythonの正規表現マッチングの制限ですか?
EDIT2:次のコードを使用して引数を分割できるようになったことを認識しています。
d["arg"] = d["args"].split(", ")
しかし、私は正規表現ですべての仕事をすることができるかどうか疑問に思いました。特に、なぜ「arg」が最後の引数だけに一致するのか疑問に思います。
EDIT3:私は(1)Pythonが毎回最後の引数のみに一致する理由を理解したいと思っていると思います。また、(2)PythonでSchemeスタイルのパターンマッチングを実行できるかどうかを確認したいと思います。または、Schemeスタイルのパターンマッチングと同じくらい直感的なものがPythonにある場合。astモジュールを見ましたが、その構文は非常に複雑です。