如何用正则表达式提取SQL别名前后的表名与列名并生成DataFrame
解决SQL视图语句的表名、别名与列名分组问题
原始SQL字符串
CREATE VIEW [dbo].[TestView] AS SELECT T1.Col1,T1.Col2,T2.Col1,T2.Col2,T3.Col1,T3.Col2 FROM table_1 T1 LEFT JOIN table_2 T2 ON T1.Col1 = T2.Col2 INNER JOIN Table_3 T3 ON T1.Col2 = T3.Col2
目标结果
期望生成如下格式的DataFrame(注:你给出的目标结果中存在列名重复笔误,以下为修正后的正确对应关系):
TableName Alias ColumnName table_1 T1 Col1 table_1 T1 Col2 table_2 T2 Col1 table_2 T2 Col2 table_3 T3 Col1 table_3 T3 Col2
解决思路与实现代码
核心思路
分两步提取关键信息,再做关联映射:
- 从SQL的
FROM/JOIN片段提取表名-别名的对应关系 - 从SQL的
SELECT片段提取别名-列名的组合 - 通过别名将两组信息关联,最终生成目标DataFrame
具体实现代码
import re import pandas as pd # 原始SQL字符串 s = """CREATE VIEW [dbo].[TestView] AS SELECT T1.Col1,T1.Col2,T2.Col1,T2.Col2,T3.Col1,T3.Col2 FROM table_1 T1 LEFT JOIN table_2 T2 ON T1.Col1 = T2.Col2 INNER JOIN Table_3 T3 ON T1.Col2 = T3.Col2""" # 1. 提取表名与别名的映射关系 # 匹配FROM/JOIN后 表名+别名 的结构,兼容大小写 table_alias_pattern = re.compile(r'(?:FROM|JOIN)\s+(\w+)\s+(T\d+)', re.IGNORECASE) table_alias_matches = table_alias_pattern.findall(s) alias_to_table = {alias: table.lower() for table, alias in table_alias_matches} # 2. 提取SELECT中的别名.列名组合 column_pattern = re.compile(r'(T\d+)\.(\w+)', re.IGNORECASE) column_matches = column_pattern.findall(s) # 3. 组装数据生成DataFrame data = [] for alias, col in column_matches: data.append({ 'TableName': alias_to_table[alias], 'Alias': alias, 'ColumnName': col }) df = pd.DataFrame(data) print(df.to_string(index=False))
代码说明
table_alias_pattern:用(?:FROM|JOIN)匹配非捕获的前置关键词,精准提取表名和对应别名,re.IGNORECASE兼容SQL中表名的大小写差异(比如你的SQL里的Table_3)column_pattern:直接匹配所有T数字.列名的结构,快速拆分出别名和列名- 最后通过字典完成别名到表名的映射,将数据整理成DataFrame格式
运行代码后会输出符合要求的结果:
TableName Alias ColumnName table_1 T1 Col1 table_1 T1 Col2 table_2 T2 Col1 table_2 T2 Col2 table_3 T3 Col1 table_3 T3 Col2
内容的提问来源于stack exchange,提问作者pythondumb
相关产品推荐
相关产品推荐

