s2="SELECT a,b,c FROM sch.Table1 a, Table4, (SELECT a, b, c FROM (select c,d FROM sch1.Table2 where x=1),Table3 where ....)"
s3="SELECT a,b,d,e FROM sch.Table1 a, sch.Table4 b, schb.Table3 WHERE 1=1"
s4="SELECT a,b,c FROM sch.table1 a,sch.table2 b WHERE colb=colc and col2=(SELECT colid FROM SCH2.TABLE3,SCH3.TABLE4 WHERE 1=1"
我有类似上面的SQL字符串。我正在尝试定义一个正则表达式,它将从SQL中获取所有表(sch.Table1,Table4,sch1.Table2等)
我使用了以下内容,它只返回一个table_name ['sch.Table2']
w1 = re.findall(r"(?:SELECT\s+.+\s+FROM\s)(?:(\w*\.*\w+)\s*\w?,?)",s2,re.IGNORECASE)
print w1
提前感谢您的帮助。
答案 0 :(得分:1)
您可以在列表理解中使用regex
,而不是使用split
:
>>> l=[s2,s3,s4]
>>> [i for s in l for i in s.split() if 'table' in i or 'Table' in i]
['sch.Table1', 'Table4,', 'sch1.Table2', 'x=1),Table3', 'sch.Table1', 'sch.Table4', 'schb.Table3', 'sch.table1', 'a,sch.table2']
或regex
:
>>> [re.findall(r'[\w\.]+Table\d|table\d',s) for s in l]
[['sch.Table1', 'sch1.Table2'], ['sch.Table1', 'sch.Table4', 'schb.Table3'], ['table1', 'table2']]
答案 1 :(得分:0)
这是一个简单的方法:
>>> s2="SELECT a,b,c FROM sch.Table1 a, Table4, (SELECT a, b, c FROM (select c,d FROM sch1.Table2 where x=1),Table3 where ....)"
>>> s3="SELECT a,b,d,e FROM sch.Table1 a, sch.Table4 b, schb.Table3 WHERE 1=1"
>>> s4="SELECT a,b,c FROM sch.table1 a,sch.table2 b WHERE colb=colc and col2=(SELECT colid FROM SCH2.TABLE3,SCH3.TABLE4 WHERE 1=1"
>>> re.findall(r"[\w\.]*Table.?",s2,re.IGNORECASE)
['sch.Table1', 'Table4', 'sch1.Table2', 'Table3']
>>> re.findall(r"[\w\.]*Table.?",s3,re.IGNORECASE)
['sch.Table1', 'sch.Table4', 'schb.Table3']
>>> re.findall(r"[\w\.]*Table.?",s4,re.IGNORECASE)
['sch.table1', 'sch.table2', 'SCH2.TABLE3', 'SCH3.TABLE4']