如何移除Confluence表格SQL字段中的--单行注释
解决单行SQL中--注释的清理问题
问题背景
通过Atlassian API抓取Confluence表格存入DataFrame后,query字段里的SQL被pd.read_html转成了单行,常规正则(比如--.*)会误删字符串内的--内容(比如'--这是字符串内容'),需要精准清理真正的注释。
核心思路
用正则区分SQL中的字符串边界,只清除不在单/双引号内的--到行尾的注释,同时兼容SQL里的转义引号(比如'it''s a test'这种写法)。
代码实现
import re import pandas as pd # 模拟从Confluence读取的DataFrame df = pd.DataFrame({ 'query': [ "SELECT id, name -- 字段注释 FROM users WHERE status = 'active' -- 条件注释", "SELECT '--字符串里的--不是注释' FROM table WHERE id > 10 -- 行尾注释" ] }) def clean_sql_comments(sql): # 正则规则:匹配字符串内容,或匹配--注释,只替换注释部分 pattern = r""" (?:['"][^'"]*(?:''|""[^'"]*)*['"]) # 匹配单/双引号包裹的字符串(含转义引号) | (--.*$) # 匹配--开头到行尾的注释 """ # 只替换捕获到的注释分组,字符串部分原样保留 return re.sub(pattern, lambda m: m.group(1) if m.group(1) else '', sql, flags=re.VERBOSE) # 批量清理query列 df['query'] = df['query'].apply(clean_sql_comments) # 导出为JSON df.to_json('cleaned_queries.json', orient='records', indent=2)
效果验证
- 原SQL:
SELECT id, name -- 字段注释 FROM users WHERE status = 'active' -- 条件注释
清理后:SELECT id, name FROM users WHERE status = 'active' - 原SQL:
SELECT '--字符串里的--不是注释' FROM table WHERE id > 10 -- 行尾注释
清理后:SELECT '--字符串里的--不是注释' FROM table WHERE id > 10
扩展支持(含/* */注释)
如果SQL里还有多行注释,可修改正则同时匹配两种注释:
pattern = r""" (?:['"][^'"]*(?:''|""[^'"]*)*['"]) # 匹配字符串 | (/\*.*?\*/) # 匹配/* */多行注释 | (--.*$) # 匹配--单行注释 """
内容的提问来源于stack exchange,提问作者Saravana Kumar
相关产品推荐
相关产品推荐

