Python正则表达式提取SQL表名:如何避免误捕列名?
提取SQL建表语句中表名的正则修正方案
核心问题
你当前的正则表达式\ba\.\w+会匹配所有以a.开头的标识符,导致列名也被误提取。要精准获取表名,必须结合Create table这个上下文来限定匹配范围。
修正方案
基础版(适配示例场景)
直接匹配Create table(不区分大小写)之后的表名:
import re table_list = set(re.findall(r'(?i)create table\s+(\w+\.\w+)', str(data)))
(?i):开启不区分大小写模式,兼容CREATE TABLE、create table等不同写法create table\s+:匹配建表关键字及后续的任意空白字符(包括换行、空格)(\w+\.\w+):捕获带schema的表名结构,比如a.dummy_table1
增强版(兼容更多建表语法)
如果需要支持CREATE TABLE IF NOT EXISTS这类扩展语法,可以调整正则:
table_list = set(re.findall(r'(?i)create\s+table\s+(?:if\s+not\s+exists\s+)?(\w+\.\w+)', str(data)))
(?:if\s+not\s+exists\s+)?:可选匹配IF NOT EXISTS片段,且不捕获该部分内容
额外说明
- 若SQL中存在多个建表语句,该正则会提取所有符合条件的表名
- 如果表名包含下划线以外的特殊字符,需要将
\w+替换为更合适的字符集,比如[\w\-]+(支持连字符)
内容的提问来源于stack exchange,提问作者Varun Das
相关产品推荐
相关产品推荐

