1

単純なPython関数のシグネチャと一致するPython正規表現を作成しようとしています。好き:

def _func1_(arg1, arg2):

私はこの正規表現を作成しました:

"def ([^\W\d]+\w*)(\(( *[^\W\d]+\w* *,? *)*\)):"

残念ながら、これはあまり良くありません。引数リストでは、スペースは変数名内に含めることができ、不要なコンマは、正規表現の引数リストのおよびに含めることができます。誰かがこの場合の正しい正規表現を手伝ってくれますか?前もって感謝します!

4

2 に答える 2

2

実際のところ、私は最近、関数ヘッダーコメントの簡単な正規表現を作成しました(CSクラスの宿題を自動的にフォーマットするため)。その要点は次のとおりです。

"def (\w+)\s*\((.*?)\):"

パラメータについては、reの使用をやめ、代わりstr.split(',')にキャプチャグループで使用し1ます。必要以上に複雑にする必要はありません。

于 2012-04-15T00:13:48.973 に答える
0

関数定義をインポートできる場合は、ASTをウォークするか、 inspectを使用してください。

シグニチャのほかにさらに解析を行う必要がある場合は、pyparsingまたはfuncparselibを検討してください。

それでも正規表現を使用する必要がある場合は、我慢してください。

import re

# Python identifiers start with a letter or _,
#and continue with these or digits. 
IDENT = '[A-Za-z_][A-Za-z_0-9]*'

# Commas between identifiers can have any amout of space on either side.
COMMA = '\s*,\s*'

# Parameter list can contain some positional parameters.
# For simplicity we ignore now named parameters, *args, and **kwargs.
# We catch the entire list.
PARAM_LIST = '\((' + IDENT+'?' + '(?:' + COMMA+IDENT + ')*'+ ')?\)'

# Definition starts with 'def', then identifier, some space, and param list.
DEF = 'def\s+(' + IDENT + ')\s*' + PARAM_LIST

ident_rx = re.compile(IDENT)
def_rx = re.compile(DEF)


def test(s):
    match = def_rx.match(s)
    if match:
        name, paramlist = match.groups()
        # extract individual params
        params = [x.group() for x in ident_rx.finditer(paramlist or '')]
        print s, name, params 
    else:
        print s, 'does not match'

test('def foo(a, b)')
test('def foo()')
test('def foo(a,b,c , d,  e)')
test('deff foo()')
test('def foo(a, 2b)')

上記のコードは、Python 2のlegalのようなものは言うまでもなく、デフォルト値、*argsまたは、または末尾のコンマを持つパラメーターを処理できないことに注意してください。これはすべて追加できますが、複雑さが増します。**kwargsdef foo(a, (b, c))

したがって、ケースがかなり単純でない限り(上記のコード例は境界線です)、上記のパーサーリンクを参照してください。

于 2012-04-15T02:52:22.993 に答える