Друзья: в PostgreSQL plpython я пытаюсь выполнить итеративный поиск/замену в текстовых блоках "данные".
Используя re-sub для определения шаблона соответствия, вызовите функцию "replace", чтобы выполнить работу. Цель состоит в том, чтобы повторять функцию "replace", поскольку некоторые замены генерируют дополнительные совпадения "правила", которые требуют дальнейшей замены.
Все работает хорошо через многие, многие замены - и мне удается запустить второй проход цикла повтора. Затем, пока что-то не заставит шаблон 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)
Над кодом, кажется, работает ОК, во вторую итерацию... затем:
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' --- с тем же результатом. Я понимаю, что должен найти синтаксис для представления объекта соответствия в некоторой читаемой форме...
Ответ на это оказался довольно простым, конечно, когда вы знаете Python! (Я не!)
Чтобы начать цикл повтора, я делал это испытание:
while re.search('(rule:[A-Za-z#]+)', data) != '':
Пробовал и этот, который тоже не сработает:
while re.search('(rule:[A-Za-z#]+)', data) != 'None':
Конечно, результат не может быть захвачен, но кавычки не нужны. Это так просто:
while re.search('(rule:[A-Za-z#]+)', data) != None:
Все так просто, как только вы это знаете!
print
. В теле вwhile
цикла, добавьте достаточноprint
функции для отображенияrepr(replace)
иrepr(data)
. Не догадывайся о том, что происходит.print
материалы. Включите вывод в свой вопрос, чтобы мы все могли видеть, что на самом деле происходит. Доказательство лучше, чем спекуляция.pdb
и осмотрите стек в точке ошибки, чтобы увидеть, на что он действительно застрял.