1

友人: PostgreSQL plpython で、テキスト ブロック 'data' で反復検索/置換を実行しようとしています。

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

すべてが非常に多くの交換でうまく機能します-そして、私は繰り返しループの2番目のパスをトリガーすることに成功しています. 次に、何らかの原因で正規表現パターンが整数 (?) を返すまで - どうやら一致するものが見つからない時点で... ?? 「なし」と「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 回目の反復で問題なく実行されているようです...その後:

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' --- も試してみましたが、結果は同じです。一致オブジェクトを読み取り可能な形式で表す構文を見つけなければならないことはわかっています...

4

1 に答える 1

0

これに対する答えは、もちろん、Python を理解すれば非常に簡単であることがわかりました。(私はしません!)

繰り返しループを開始するために、次のテストを行っていました。

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

これも試してみましたが、これも機能しません:

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

もちろん、None の結果はトラップできますが、引用符は必要ありません。それはそれと同じくらい簡単です:

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

一度知ってしまえば、とても簡単です。

于 2011-09-16T20:32:57.827 に答える