2017-06-30 14 views
1

こんにちは私はこのクエリを持っていて、ちょうどt0_0.pp,0を抽出したいと思います。それはCOALESCENSE()です。私はこれのためにCOALESCENSEの前または後にもっとparethesisを持つことができます。私はこのような正規表現(([^()] +))を使用しようとしていますが、すべての括弧の中に私を抱きしめていて、私はCOALESCENSE何か案が?正規表現pythonで選択された括弧の中にあるものを見つける方法は?

select DISTINCT SUM(case when t0_0.pp is not null then COALESCE(t0_0.pp,0) 
else 0 end) from inventory_coverage_view t0_0 where LOWER(t0_0.h) ='vg' AND t0_0.id = '9' 

は、事前にあなたに感謝:)

+0

regexesはカウントできないため、これを行う方法はありません。パーサーを使用する必要があります。 –

+0

関連:https://stackoverflow.com/q/5454322/67579 –

+1

'r.COALESCE \((*?)\)' 'を' re.search'と組み合わせて使用​​すると( 'm = re .search(pat、s) ')はグループ1の値を取得します(' m.group(1) ')。これは 'COALESCE'カッコの中に他の') 'がないと仮定して動作します。そうでなければ、任意のSQLクエリを解析するためには、特定のパーサが本当に必要です。 –

答えて

3

を任意のSQLクエリを解析するために、あなたは本当に特定のパーサーが必要です。

あなたはCOALESCE括弧内の他の)は存在しないことができることを確認するために知っている場合は、次の方法であなたの正規表現を更新することがあります。

import re 
pat = r"COALESCE\((.*?)\)" 
s = "select DISTINCT SUM(case when t0_0.pp is not null then COALESCE(t0_0.pp,0)\nelse 0 end) from inventory_coverage_view t0_0 where LOWER(t0_0.h) ='vg' AND t0_0.id = '9'" 
m = re.search(pat, s) 
if m: 
    print(m.group(1)) # => t0_0.pp,0 

regex demoPython demoを参照してください。

  • COALESCE\(は - グループ1
  • \)に、できるだけ少ないように改行文字以外の任意の0+文字を、キャプチャ - - COALESCE(リテラルストリング
  • (.*?)に一致するリテラル)と一致します。
+0

'[^)] *'の代わりに '。*?'を使う理由はありますか? –

+1

@SebastianProske:はい。次の行にオーバーフローしないようにする。私はパターンを説明しました:* '。*?' ...改行文字以外の任意の0以上の文字*。改行がある場合、 '[^)] *'は自然な解決策です。前提に基づく質問では、これらのニュアンスは関係ありません(実際のデータOPは表示されません)。ここでの主なポイントは、左側のコンテキストを追加することでした。さらに、OPはより多くのパターンで正確な右側境界線を持たなければならないと思うし、 '。*? 'はより便利になるだろう。改行を一致させるために、 're.S'フラグを渡すことができます:' re.search(pat、s、flags = re.S) ' –

+0

ありがとう、ありがとう。私の疑問が批判であるとは思わないでください、私はちょうど興味がありました。 –

関連する問題