関数定義をインポートできる場合は、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
または、または末尾のコンマを持つパラメーターを処理できないことに注意してください。これはすべて追加できますが、複雑さが増します。**kwargs
def foo(a, (b, c))
したがって、ケースがかなり単純でない限り(上記のコード例は境界線です)、上記のパーサーリンクを参照してください。