如何在Pandas DataFrame中遍历行并用正则提取SQL表名?
从CSV文件中的批量SQL语句提取表名
现有单条SQL提取实现
已实现使用re.findall从单条SQL语句中提取表名,代码示例如下:
import re Query = ["SELECT * FROM WS_DE_Staging.stage_dual_h_20"] for xx in Query: r1 = re.findall(r"FROM|JOIN|from|join\s+([A-Za-z_.\[\]]+)",xx) print(r1)
需求:批量处理CSV中的SQL语句
需要处理存储在CSV文件中的批量SQL语句:通过Pandas读取CSV生成DataFrame,其中包含报表名称和对应的SQL语句,需遍历DataFrame的所有行,复用上述正则表达式提取所有SQL语句中的表名。现有相关代码片段:
import re Query = ["SELECT * FROM WS_JE_Staging.stage_dual_h_20", "Select * from DummyEmployee"] for xx in Query: r1 = re.findall(r"FROM|JOIN|from|join\s+([A-Za-z_.\[\]]+)",xx) print(r1) import pandas as pd, re, numpy as np df = pd.read_csv("SqlQ.csv", delimiter=',') print(df.index)
解决方案
可以通过Pandas的apply方法遍历DataFrame的每一行,对SQL语句列应用正则提取逻辑,以下是完整实现:
步骤1:封装提取逻辑为函数
将正则提取逻辑封装成函数,便于复用和维护:
def extract_table_names(sql): # 使用不区分大小写标志简化正则,无需重复匹配大小写关键词 pattern = re.compile(r'(?:FROM|JOIN)\s+([A-Za-z_.\[\]]+)', re.IGNORECASE) return re.findall(pattern, sql)
注:re.IGNORECASE标志让正则自动匹配FROM/from、JOIN/join等大小写变体,简化表达式写法。
步骤2:读取CSV并处理DataFrame
读取CSV后,对包含SQL语句的列(假设列名为sql_query,需根据实际CSV结构修改)应用提取函数,生成新的表名列:
import pandas as pd import re def extract_table_names(sql): pattern = re.compile(r'(?:FROM|JOIN)\s+([A-Za-z_.\[\]]+)', re.IGNORECASE) return re.findall(pattern, sql) # 读取CSV文件 df = pd.read_csv("SqlQ.csv", delimiter=',') # 替换为CSV中实际存储SQL语句的列名 df['extracted_tables'] = df['sql_query'].apply(extract_table_names) # 查看报表名称与对应提取的表名 print(df[['报表名称', 'extracted_tables']])
关键说明
- 若CSV中SQL语句的列名不是
sql_query,请替换为实际列名(如SQL、query_content等)。 - 若需处理包含特殊字符或空格的表名,可调整正则表达式的字符匹配范围(例如添加
\s或其他允许的字符)。 apply方法会自动遍历DataFrame的每一行,对指定列的每个值执行提取函数,无需手动写循环遍历行。
内容的提问来源于stack exchange,提问作者Gaurav Jan
相关产品推荐
相关产品推荐

