You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 19:49:59