2016-03-29 13 views
1

は、いくつかのサンプル入力です:関数から式を抽出するための正規表現?ここ

Fxfu(x1,Y,n<X+Y) 

Fxfu(x1,Y(n,A,B),Z(n,A,B)+M(n,A,B)<n) 

Fxfu(x1,Y(n),Z(n)^M(n)<X+Y) 

Fxfu(x1,(n,A,B),Z(n)^M(n)<T(n,A,B)) 

と私はそれに対応する出力になりたい:

n<X+Y 

Z(n,A,B)+M(n,A,B)<n 

Z(n)^M(n)<X+Y 

Z(n)^M(n)<T(n,A,B) 

私は、次のコード

find=regex.compile(r'(Fxfu\(x\d+[,]([Y]\((.*)\)[,]))|Fxfu\(x\d+[,]([Y][,])') 
    group = find.search(expression) 
    print expression.replace(group.group(0),"") 

に行うには、任意のより良い方法を書かれています上記のように、配列内のすべてのパラメータを次のように抽出することができます。

[x1,Y,n<X+Y] 
[x1,Y(n,A,B),Z(n,A,B)+M(n,A,B)<n] 
[x1,Y(n),Z(n)^M(n)<X+Y] 
[x1,(n,A,B),Z(n)^M(n)<T(n,A,B)] 
+0

以前同じ質問をしましたか? – Barmar

+1

なぜ 'Fxfu'の代わりに' [F] [x] [f] [u] 'と書いていますか? – Barmar

+3

正規表現は、このような再帰パターンの解析には一般的には適していません。再帰的な降下パーサーを使用する必要があります。 – Barmar

答えて

3

正規表現は、コメントに説明されているように、タスクには適していません。ただし、カッコを数えることで、1回のパスで問題を簡単に解決できます。

def extract_args(expr): 
    paren = 0 
    start = 0 
    ret = [] 
    for i, c in enumerate(expr): 
     if c=='(': 
      paren+=1 
      if paren==1: 
       start=i+1 
     elif c==')': 
      if paren==1 and start: 
       ret.append(expr[start: i]) 
      paren-=1 
     elif c==',' and paren==1: 
      ret.append(expr[start:i]) 
      start=i+1 
    return ret 
+0

こんにちはありがとうございました。 "TypeError:文字列インデックスは、条件" elif c == '、およびparen == 1の場合、タプルではなく整数でなければなりません。 " – Tom

+0

@Tom:同様のエラーがありました以前の私の回答の改訂では、現在のものが[ok](https://ideone.com/lyyu0r)でなければなりません。 –

+0

@おめでとうございます。 – Tom