pl / python TypeError: элемент последовательности 21: ожидаемая строка, int найдено - PullRequest
1 голос
/ 09 сентября 2011

Друзья: в PostgreSQL plpython я пытаюсь выполнить итеративный поиск / замену в текстовом блоке 'data'.

Использование 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)

Над кодом кажется, что работает нормально, во второй итерации ... затем:

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 голосов
/ 17 сентября 2011

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

Это все так просто, раз ты знаешь!

...