Python正则匹配SQL中首次出现的数据库名结果异常求助
修正正则表达式提取首次出现的数据库名
原正则使用贪婪匹配的(.*),会从第一个匹配起始位置一直匹配到最后一个as db_name前的内容,导致捕获大量无关文本。只需将正则改为非贪婪匹配并明确引号边界,即可精准捕获首次出现的数据库名。
修正后的代码
import re sql = 'select col1, col2, "base" as db_name, "employee" as table_name from base.employee where id is not NULL union select col1, col2, "base" as db_name, "employee" as table_name from base.employee where ts is not NULL' # 使用非贪婪匹配.*?,并限定引号边界 result_dbname = re.search(',?"(.*?)" as db_name', sql) if result_dbname: db_name = result_dbname.group(1) print(db_name) # 输出: base
关键说明
.*?:非贪婪匹配模式,遇到第一个闭合的双引号就停止匹配,确保只捕获首次出现的数据库名字符串,?:兼容字段前可能存在逗号的情况(比如SQL中字段列表的分隔)- 增加
if result_dbname判断,避免正则匹配失败时触发AttributeError
拓展:提取首次出现的表名
用同样的逻辑可以提取表名:
result_tablename = re.search(',?"(.*?)" as table_name', sql) if result_tablename: table_name = result_tablename.group(1) print(table_name) # 输出: employee
内容的提问来源于stack exchange,提问作者Nats
相关产品推荐
相关产品推荐

