2011-09-09 5 views
1

フレンド:PostgreSQL plpythonで、テキストブロック 'data'の反復検索/置換を試みています。pl/python TypeError:シーケンスアイテム21:期待される文字列、intが見つかりました

re-subを使用して一致パターンを定義し、 'replace'関数を呼び出して作業を行います。 目的は、いくつかの置換がさらなる置換を必要とするさらなる「規則」一致を生成するため、繰り返し呼び出される 'replace'関数を持つことです。

すべてがうまくいきます。私はリピートループの2回目のパスをトリガーします。次に、Regexパターンが何らかの整数(?)を返すまで、明らかにその点では一致するものは見つからない...?私は 'なし'と '0'のテストを試みましたが、運がありません。アイデア?コード上記

data = (a_huge_block of_text) 

# ====================== THE FUNCTION ============== 
def replace(matchobj): 
tag = matchobj.group(1) 
plpy.info("-------- matchobj.group(1), tag: ", tag) 
if matchobj.group(1) != '': 
    (do all the replacement work in here) 
# ====================== END FUNCTION ============== 

passnumber = 0 
# If _any_ pattern match is found, process all of data for _all_ matches: 
while re.search('(rule:[A-Za-z#]+)', data) != '': 
# BEGIN repeat loop: 
passnumber = passnumber + 1 
plpy.info(' ================================ BEGIN PASS: ', passnumber) 

data = re.sub('(rule:[A-Za-z#]+)', replace, data) 
plpy.info(' =================================== END PASS: ', passnumber) 

そして...第2の繰り返しに、OK実行されてを思わ:

ERROR: TypeError: sequence item 21: expected string, int found 
CONTEXT: Traceback (most recent call last): 
    PL/Python function "myfunction", line 201, in <module> 
    data = re.sub('(rule:[A-Za-z#]+)', replace, data) 
    PL/Python function "myfunction", line 150, in sub 
PL/Python function "myfunction" 

も(...)re.searchを試してみました= '' - ! re.search(...)!= 'None' ---同じ結果を返します。 私は、一致オブジェクトをいくつかの可読形式で表現するための構文を見つけなければなりません...

+0

このようなことを考え出すのは難しいことです。これは 'print'関数と呼ばれます。 'while'ループの本体に、' repr(replace) 'と' repr(data) 'を表示するのに十分な' print'関数を追加してください。何が起こっているのか推測しないでください。 'print'ものです。あなたの質問に出力を含めて、実際に**起こっていることをすべて確認することができます。証明は推測よりも優れています。 –

+0

さらに、['pdb'](http://docs.python.org/dev/library/pdb.html)を使用して、エラーが発生した時点でスタックを調べて、実際にスタックされていることを確認してください。 –

+1

@ S.Lott:plpythonから印刷出力機能があるとは思わない。私はplpy.infoコールを持っています。 – DrLou

答えて

0

これに対する答えは、もちろんPythonを知っていれば非常に簡単です。 (私はしないでください!)

が繰り返しループを開始するために、私はこのテストをやっていた:

while re.search('(rule:[A-Za-z#]+)', data) != 'None': 

while re.search('(rule:[A-Za-z#]+)', data) != '': 

もまた動作しませんこの1を、しようとしましたもちろん、Noneの結果はトラップできますが、引用符は必要ありません。

while re.search('(rule:[A-Za-z#]+)', data) != None: 

これはとても簡単です。一度知っておけばそれほど簡単です!

関連する問題