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

SQL列与别名提取:请求优化Python正则以匹配特殊格式列

解决SQL SELECT列名与别名提取问题

针对包含方括号包裹列、SUM嵌套列、带冒号/点号列的SQL SELECT语句,这里提供一个能覆盖多数场景的正则表达式,同时附上Python实现代码:

核心正则表达式

(?<=SELECT|,)\s*((?:\w+\()?(?:\[.*?\]|[\w:.]+)(?:\))?)\s*(?:AS\s+|\s+)?([\w]+)?

正则说明

  • (?<=SELECT|,):正向断言,匹配SELECT关键词之后或者逗号之后的内容,避免遗漏首列
  • \s*:匹配列名前的任意空白字符
  • (?:\w+\()?:匹配SUM这类函数前缀(比如SUM(),非捕获组
  • (?:\[.*?\]|[\w:.]+):匹配两种列格式:方括号包裹的列([列名]),或者含字母、数字、冒号、点号的列(比如tbl.col、schema:col)
  • (?:\))?:匹配函数的闭合括号(比如)),非捕获组
  • (?:\s+AS\s+|\s+)?:匹配别名前的分隔符,支持AS 别名、直接空格分隔别名,或者无别名的场景
  • ([\w]+)?:捕获别名,允许无别名的情况(此时结果为空)

Python代码实现

import re
import csv

# 示例SQL语句
sql = """
SELECT [User ID] AS user_id, SUM([Order Amount]) AS total_sales,
       tbl.customer_name, schema:region_code AS region
FROM orders
"""

# 编译正则(忽略大小写,兼容小写as)
full_pattern = re.compile(r'(?<=SELECT|,)\s*((?:\w+\()?(?:\[.*?\]|[\w:.]+)(?:\))?)\s*(?:AS\s+|\s+)?([\w]+)?', re.IGNORECASE)
# 提取列名与别名匹配结果
results = full_pattern.findall(sql)

# 处理结果:清理函数包裹、方括号,无别名时用列名本身
processed = []
for col, alias in results:
    # 去掉外层函数(比如SUM([Order Amount]) -> [Order Amount])
    col_clean = re.sub(r'^\w+\((.*)\)$', r'\1', col)
    # 去掉方括号
    col_clean = col_clean.strip('[]')
    # 别名为空时用清理后的列名
    final_alias = alias if alias else col_clean
    processed.append((col_clean, final_alias))

# 写入CSV文件
with open('columns_aliases.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f)
    writer.writerow(['列名', '别名'])
    writer.writerows(processed)

注意事项

  • 该正则支持大多数常见的SQL SELECT列格式,若遇到多层嵌套函数的极端场景,需要进一步调整正则逻辑
  • 若SQL中存在注释,建议先清理注释后再匹配,避免干扰
  • 正则通过re.IGNORECASE实现大小写不敏感,兼容as小写的写法

内容的提问来源于stack exchange,提问作者justanothertekguy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 13:27:31