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
相关产品推荐
相关产品推荐

