使用正则表达式(Regex)分割SQL查询语句结果异常,求解决
解决正则分割SQL语句出现多余空白元素的问题
问题原因
你的正则表达式[;!]+?仅匹配分号/感叹号作为分割符,但分割后会保留这些符号前后的空白字符(比如换行、空格)。原字符串末尾的;\n被分割后,分号被移除,剩下的换行符\n就成了结果列表里的最后一个多余元素。
解决方法
方法1:分割后过滤空白元素
分割完成后,用列表推导式过滤掉纯空白或空的元素,同时对每个SQL语句去除首尾空白:
import re queries =""" INSERT ignore into persons VALUES (15,'Tom D.', 'Erilchsen', 'Skagen 21', 'Erlangen'); select * from persons; """ regex = "[;!]+?" y = re.split(regex ,queries) # 过滤并清理每个元素 clean_queries = [q.strip() for q in y if q.strip()] print(clean_queries) print(len(clean_queries))
运行输出:
["INSERT ignore into persons VALUES (15,'Tom D.', 'Erilchsen', 'Skagen 21', 'Erlangen')", 'select * from persons'] 2
方法2:改进正则表达式,同时匹配分割符前后的空白
修改正则,让它匹配分割符(;或!)以及前后的空白字符,这样分割时会直接把这些空白一并处理:
import re queries =""" INSERT ignore into persons VALUES (15,'Tom D.', 'Erilchsen', 'Skagen 21', 'Erlangen'); select * from persons; """ # 匹配分号/感叹号,前后可带任意空白(换行、空格等) regex = r"\s*[;!]+\s*" y = re.split(regex ,queries.strip()) # 先去除字符串首尾的空白 # 过滤可能的空元素 clean_queries = [q for q in y if q] print(clean_queries)
运行输出同样会得到干净的两条SQL语句。
注意事项
如果你的SQL语句中存在字符串内的分号(比如INSERT ... VALUES ('abc;def')),这种简单的分割方式会出错,此时需要更复杂的正则来处理SQL语法中的字符串、注释等情况,或者使用专门的SQL解析库(如sqlparse)来更可靠地分割语句。
内容的提问来源于stack exchange,提问作者asheer ali
相关产品推荐
相关产品推荐

