Этот подход использует pyparsing для фактического анализа операторов SQL (в рамках синтаксиса подмножества, который вы показали в своих примерах):
import pyparsing as pp
ppc = pp.pyparsing_common
ident = ppc.identifier
CREATE, INSERT, INTO, TABLE, AS, SELECT, FROM, JOIN = \
map(pp.CaselessKeyword, "CREATE INSERT INTO TABLE AS SELECT FROM JOIN".split())
select_stmt = (SELECT
+ (pp.delimitedList(ident) | '*')("columns")
+ FROM
+ ((ident + JOIN.suppress() + ident) | ident)("tables"))
src_target_stmt = ((CREATE + TABLE | INSERT + INTO)("action")
+ ident("target")
+ AS
+ pp.Group(select_stmt)("source"))
tests = """
CREATE TABLE TAR_TAB1 AS SELECT * FROM SRC_TAB1 JOIN SRC_TAB2
CREATE TABLE TAR_TAB2 AS SELECT * FROM SRC_TAB3 JOIN SRC_TAB4
INSERT INTO TAR_TAB3 AS SELECT COL1,COL2 FROM SRC_TAB5 JOIN SRC_TAB6
"""
# useful for debugging
#src_target_stmt.runTests(tests)
# dump parsed values out as CSV output
for t in tests.splitlines():
if not t.strip():
continue
result = src_target_stmt.parseString(t)
target = result.target
action = result.action[0]
for src in result.source.tables:
print("{},{},{}".format(action, target, src))
Выводит:
CREATE,TAR_TAB1,SRC_TAB1
CREATE,TAR_TAB1,SRC_TAB2
CREATE,TAR_TAB2,SRC_TAB3
CREATE,TAR_TAB2,SRC_TAB4
INSERT,TAR_TAB3,SRC_TAB5
INSERT,TAR_TAB3,SRC_TAB6
Как вы продолжаете свой проект и обнаруживаете новые требования (необходимо извлечь действие SQL, как показано в этом примере, или вы найдете другие варианты конструкций SQL, которые вам нужно понять при синтаксическом анализе), расширение синтаксического анализатора будет проще и более удобен в обслуживании, чем расширение регулярного выражения.