如何处理含转义反斜杠的字符串并提取表名?str.replace失效
处理转义字符串并提取SQL表名的方法
先理清转义问题
你拿到的字符串里的\\"是HTML转义后的结果,对应实际SQL里的双引号。如果是从HTML直接获取的内容,用str.replace('\\"', '"')就能还原成正常的SQL语句;如果是Python代码中定义的字符串,\\"实际存储为\"(Python的转义双引号),Python运行时会自动解析,无需额外处理。
提取表名的两种实用方法
方法一:正则表达式(简单直接)
用正则精准匹配FROM后面的"schema"."table"格式,示例代码:
import re # 原始带转义的字符串 my_string = "select \\"ASSETS\\" AS \\"LEASE_ASSETS\\", count(*) CNT FROM \\"SIY\\".\\"I7_MAIN_ACCOUNT\\" group by \\"ASSETS\\" order by \\"ASSETS\\"" # 清理转义,还原正常SQL clean_sql = my_string.replace('\\"', '"') # 匹配"库名"."表名"的正则模式 pattern = r'FROM\s+"([^"]+)"\."([^"]+)"' match_res = re.search(pattern, clean_sql, re.IGNORECASE) if match_res: full_table_name = f'"{match_res.group(1)}.{match_res.group(2)}"' print(full_table_name) # 输出:"SIY.I7_MAIN_ACCOUNT"
方法二:SQL解析库(适配复杂SQL)
如果SQL结构多变,用专业解析库更可靠,比如sqlparse:
- 先安装库:
pip install sqlparse
- 提取表名的代码:
import sqlparse def extract_full_table(sql): parsed_sql = sqlparse.parse(sql)[0] from_flag = False table_parts = [] for token in parsed_sql.tokens: if from_flag and token.ttype is None and token.value.strip(): # 提取库和表名,去掉引号 table_parts.append(token.value.strip('"')) break # 定位到FROM关键字 if token.ttype == sqlparse.tokens.Keyword and token.value.upper() == 'FROM': from_flag = True # 遇到GROUP BY/ORDER BY就停止遍历 if token.ttype == sqlparse.tokens.Keyword and token.value.upper() in ('GROUP BY', 'ORDER BY'): break return f'"{".".join(table_parts)}"' # 清理转义后提取表名 clean_sql = my_string.replace('\\"', '"') print(extract_full_table(clean_sql)) # 输出:"SIY.I7_MAIN_ACCOUNT"
为什么你的str.replace没效果?
之前如果用str.replace('\\', '')肯定没用,因为你要替换的是完整的HTML转义实体\\",而不是单独的反斜杠。正确的替换目标是'\\"',替换成'"'才能还原正常SQL语句。
内容的提问来源于stack exchange,提问作者nokia mobile
相关产品推荐
相关产品推荐

