Замена вложенного регулярного выражения в python - PullRequest
0 голосов
/ 14 сентября 2011

Я перевожу SQL с одной платформы на другую.SQL содержит операторы DECODE, которые не поддерживаются моей целевой платформой.

Я использую регулярные выражения для преобразования операторов декодирования в операторы case, но мне не удается выполнить вложенные декодирования:

import re
sql_frag = "select decode(dim1,'','-',dim1) as myfield1, decode(dim2,'','-',dim2') as myfield2"
reg=re.compile("(decode\((.*?),(.*?),(.*?),(.*?)\))",re.IGNORECASE)

matches = reg.findall(sql_frag)
for match in matches:
sql_frag = sql_frag.replace(match[0],'case when %s = %s then %s else %s end' % (match[1],match[2],match[3],match[4]))

будет соответствовать всем вхождениям декодирования в

select decode(dim1,'','-',dim1) as myfield1, decode(dim2,'','-',dim2') as myfield2

и будет заменяться на операторы case:

select case when dim1 = '' then '-' else dim1 end as myfield1, case when dim2 = '' then '-' else dim2' end as myfield2

Но код срабатывает при вложенных операторах декодирования:

sql_frag="select decode(f1,3,4,decode(f2,5,4,f2)) as myfield, decode(foo,bar,baz,foo) as myfield2"

>>> reg.findall(sql_frag)
[('decode(f1,3,4,decode(f2,5,4,f2)', 'f1', '3', '4', 'decode(f2,5,4,f2'), ('decode(foo,bar,baz,foo)', 'foo', 'bar', 'baz', 'foo')

и возвращает

select case when f1 = 3 then 4 else decode(f2,5,4,f2 end) as myfield, case when foo = bar then baz else foo end as myfield2

Есть ли способ обработки самого внутреннего декодирования перед остальными, чтобы я мог чисто заменить все операторы декодирования на операторы case?

1 Ответ

1 голос
/ 14 сентября 2011

Есть ли способ обработки самого внутреннего декодирования перед остальными, чтобы я мог чисто заменить все операторы декодирования на операторы case?

Да.

Используйте ((?![^)]*decode).*?) вместо любого (.*?), где юридически может быть вложено DECODE.Запустите регулярное выражение в цикле.

Имейте в виду, что это может не сработать, если есть строки (то есть "THEN values"), которые содержат слово "decode".Если вы знаете свои данные и можете исключить этот случай, приведенный выше подход регулярного выражения будет достаточно для вашего одноразового использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...