pl / python TypeError: элемент последовательности 21: ожидаемая строка, int найдено

1

Друзья: в 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' --- с тем же результатом. Я понимаю, что должен найти синтаксис для представления объекта соответствия в некоторой читаемой форме...

  • 0
    Есть хитрость в выяснении такого рода вещей. Это называется функцией print . В теле в while цикла, добавьте достаточно print функции для отображения repr(replace) и repr(data) . Не догадывайся о том, что происходит. print материалы. Включите вывод в свой вопрос, чтобы мы все могли видеть, что на самом деле происходит. Доказательство лучше, чем спекуляция.
  • 0
    Еще лучше, используйте pdb и осмотрите стек в точке ошибки, чтобы увидеть, на что он действительно застрял.
Показать ещё 6 комментариев
Теги:
plpython

1 ответ

0
Лучший ответ

Ответ на это оказался довольно простым, конечно, когда вы знаете 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:

Все так просто, как только вы это знаете!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню