2012-03-10 18 views
0

を分割すると、いくつかの簡単な関数はPythonでコールします:Pythonの:ここで機能と引数

 
foo(arg1, arg2, arg3) 
func1() 

それが有効な関数呼び出しであると仮定します。

ファイルの解析中にこれらの行を読み込むとします。

関数名とargsを2つの要素(関数名用の最初の文字列と引数用の文字列)を持つリストに分ける最もクリーンな方法は何ですか?

望ましい結果:

 
["foo", "arg, arg2, arg3"] 
["func1", ""] 

私は現在、右サイドからの「(」左サイドからの最初のインスタンス「)」の最初のインスタンスを見つけるために、文字列検索を使用していますし、ちょうどスプライシング文字列にインデックスを付けると、問題に近づいているのが好きではありません。

答えて

2

私は現在、正規表現を使用して同様のことを行っています。あなたのケースに自分のコードを適用すると、あなたが提供する例で次のことが働きます。

import re 

def explode(s): 
    pattern = r'(\w[\w\d_]*)\((.*)\)$' 
    match = re.match(pattern, s) 
    if match: 
     return list(match.groups()) 
    else: 
     return [] 
+0

ああ、それはネストされたカッコで入力を処理します。かっこのマッチングはどのようにして行われますか? – MxyL

+2

これはありません。これは、現在の実装と同じです。行の最後のかっこを選択するだけです。 – Amber

+0

ああ、私は見ている。 – MxyL

2

PythonファイルをPythonで解析する場合は、Pythonのパーサー:ast(特にast.parse()呼び出し)を使用することを検討してください。

しかし、あなたの現在のアプローチはひどいわけではありません(ただし、複数の行を迷惑メールとする関数呼び出しが壊れます)。前述の完全なパーサーには完全に正しいアプローチがいくつもありません。例えば、一致する括弧を数えれば、真ん中に改行があってもa((b,c))は正しい値を返しますが、そのコードはおそらく間違っていますa((b, "c)"))に直面したときなど。

+0

提案していただきありがとうございます。しかし、実際にはpythonファイルではありません。私はちょうど問題を簡単に説明する方法を考えることができませんでした。これは、名前から値を分離することに関心のある「名前(値)」という形式の文字列を処理する一般的な問題です。 – MxyL

+2

それから私はそれが依存していると思う - あなたの値はかっこのある文字列のようなものを許していますか?そうでなければ、問題ははるかに簡単ですが、そうした場合、状態を把握しなくても、言語が使用するのと同じ構文解析ロジックを効果的に書き直しています。 – Amber

+0

ユーザーが意図的に間違った入力を選択しない限り、期待できる入力のいずれかが括弧を含むようには見えません。その場合は、フォーマットに従わないという理由で怒鳴ります。 – MxyL

関連する問題