9

次のような文字列があるとします。

"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モジュールを見ましたが、その構文は非常に複雑です。

4

3 に答える 3

9

正規表現は複雑なプログラミング言語を解析できません。

Pythonを解析しようとしているだけの場合は、astモジュールを確認することをお勧めします。これにより、Pythonが解析されます。

于 2012-04-15T17:21:58.163 に答える
5

そこに90%いるようですが、グループとグループを入れ替えて、argargsのことを行ってみませんか。

import re

fn_match = re.match(r"(?P<function>\w+)\s?\((?P<arg>(?P<args>\w+(,\s?)?)+)\)", s)
fn_dict = fn_match.groupdict()
del fn_dict['args']
fn_dict['arg'] = [arg.strip() for arg in fn_dict['arg'].split(',')]
于 2012-04-15T17:38:40.690 に答える
1

質問の最後の部分に答えるには:いいえ。PythonにはSchemeの「一致」に似たものはなく、ML/Haskellのようなパターン一致もありません。それが持っている最も近いものは、このようなものを分解する能力です

>>> (a, [b, c, (d, e)]) = (1, [9, 4, (45, 8)])
>>> e
8

そして、このように(Python 3.xで)リストの先頭と末尾を抽出するには...

>>> head, *tail = [1,2,3,4,5]
>>> tail
[2, 3, 4, 5]

Pythonで実際のパターンマッチングを行うモジュールがいくつか浮かんでいますが、その品質を保証することはできません。

やらなければならない場合は、少し異なる方法で実装します。おそらく、型とオプションの引数(長さ、正確な内容など)を入力する機能と、一致した場合に呼び出す関数があります。たとえば、match([list 、length = 3、check =(3、str)、func])これは(list _ _ somestr)と一致し、スコープ内にsomestrを指定してfuncを呼び出します。さらに、パターンを追加することもできます。

于 2012-04-17T00:33:02.830 に答える