首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python中的嵌套正则表达式替换

python中的嵌套正则表达式替换
EN

Stack Overflow用户
提问于 2011-09-15 02:19:49
回答 1查看 261关注 0票数 0

我正在将SQL从一个平台迁移到另一个平台。SQL包含我的目标平台不支持的DECODE语句。

我使用正则表达式将decode语句转换为case语句,但在嵌套解码时失败:

代码语言:javascript
复制
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]))

将匹配所有出现的decode

代码语言:javascript
复制
select decode(dim1,'','-',dim1) as myfield1, decode(dim2,'','-',dim2') as myfield2

并将替换为case语句:

代码语言:javascript
复制
select case when dim1 = '' then '-' else dim1 end as myfield1, case when dim2 = '' then '-' else dim2' end as myfield2

但是代码会在嵌套的解码语句上出错:

代码语言:javascript
复制
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')

并返回

代码语言:javascript
复制
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语句?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-15 02:26:21

有没有一种方法可以先处理最里面的解码,然后再处理其他解码,这样我就可以干净利落地用case语句替换所有的解码语句?

是。

在嵌套(.*?)可能合法出现的情况下,使用((?![^)]*decode).*?)代替任何DECODE。在循环中运行正则表达式。

请注意,如果存在包含单词"THEN“的字符串(即”decode值“),则此操作可能会失败。如果您知道您的数据,并且可以排除这种情况,那么上面的正则表达式方法将会很好-对于您的一次性用例来说已经足够了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7421068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档