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

Python正则去除SQL单行注释:避免误匹配引号内的--

问题:正则误匹配SQL引号内的--,需精准去除单行注释

原代码使用正则去除SQL单行注释时,会误将单引号内的--(如'--' AS BLANK)识别为注释删除,导致生成无效SQL。

原代码

import re

rgxcomment = re.compile(r"(--[^\n]*)", re.MULTILINE|re.IGNORECASE) 
x = rgxcomment.findall(item)
if len(x)>0:
    item = item.replace(';','')
    for j in x:
        index = item.find(j)
        item = item[:index] + '' + item[index+len(j):]

原SQL示例

CREATE  TESTING.TABLENAME AS
SELECT
a.TYPE, -- type 
'--' AS BLANK,
a.ID,
--a.MONTH,
a.DAY
from tablea a

解决方案:修改正则规则,避开单引号内的内容

核心思路是先匹配并跳过单引号包裹的内容(包含转义单引号的场景),再匹配真正的单行注释。修改后的正则表达式及优化代码如下:

优化后的完整代码

import re

def remove_sql_singleline_comments(sql):
    # 匹配单引号内容或单行注释,仅捕获注释部分
    rgxcomment = re.compile(r"'(?:\\'|[^'])*'|(--[^\n]*)", re.MULTILINE)
    # 替换逻辑:捕获到注释则清空,否则保留原内容(单引号部分)
    def replace_match(match):
        comment = match.group(1)
        return '' if comment else match.group(0)
    # 执行替换
    cleaned_sql = rgxcomment.sub(replace_match, sql)
    # 保留原代码的分号移除逻辑(不需要可删除)
    cleaned_sql = cleaned_sql.replace(';', '')
    return cleaned_sql

# 测试原SQL
original_sql = """CREATE  TESTING.TABLENAME AS
SELECT
a.TYPE, -- type 
'--' AS BLANK,
a.ID,
--a.MONTH,
a.DAY
from tablea a"""

cleaned_sql = remove_sql_singleline_comments(original_sql)
print(cleaned_sql)

正则规则解释

  • '(?:\\'|[^'])*':匹配单引号包裹的完整字符串,\\'处理转义单引号,[^']匹配非单引号字符,确保单引号内的所有内容都被跳过,不会被误判为注释。
  • |(--[^\n]*):当未匹配到单引号内容时,匹配以--开头的单行注释,直到行尾。

处理后结果

CREATE  TESTING.TABLENAME AS
SELECT
a.TYPE, 
'--' AS BLANK,
a.ID,

a.DAY
from tablea a

真正的单行注释-- type和--a.MONTH,被正确移除,单引号内的'--' AS BLANK完整保留,生成的SQL合法有效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 16:33:14