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

