pl/python 类型错误:序列项 21:期望字符串,找到整型

1 投票
1 回答
1641 浏览
提问于 2025-04-17 01:52

朋友们:在PostgreSQL的plpython中,我正在尝试对一个文本块'data'进行反复的搜索和替换。

我使用re-sub来定义一个匹配模式,然后调用一个叫'replace'的函数来完成替换工作。我的目标是让'replace'函数不断被调用,因为有些替换会生成新的“规则”匹配,这些匹配又需要进一步的替换。

一切都进行得很顺利,经过很多次替换后,我成功地触发了第二轮的循环。但是,直到某个原因导致正则表达式的模式返回一个整数(?)——显然是在找不到匹配的时候... ?? 我尝试检查'None'和'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)

上面的代码看起来运行得不错,进入了第二次迭代... 然后:

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' --- 结果都是一样。我意识到我必须找到一种语法来以某种可读的形式表示匹配对象...

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:

一旦你知道了,这一切都变得很简单!

撰写回答