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


在此先感谢您的帮助。

最佳答案

您可以在列表推导中使用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']]

10-04 23:15