我只从这样的查询中提取了列字段
query_split = [query[query.find("select") + len("select"): query.find("from")]]
我有一根这样的绳子
^{pr2}$我想要一份这样的清单
[' service','count(*) as count','round(sum(mrp),2) as sale']
这是因为我想得到列名列表
['service','count','sale']
我试过其他方法,比如
for file in reader(query_split):
print(file)
给我输出
[' service', 'count(*) as count', 'round(sum(mrp)', '2) as sale ']
在mrp类型的查询(2)中,在该类型的sum(取整)测试中失败的情况下
def get_column_name(query):
"""
Extracts the column name from a sql query
:param query: str
:return: column_name
list: Column names which that query will fetch
"""
column_name=[]
query_split = query[query.find("select") + len("select"): query.find("from")]
for i in query_split.split(','):
if "as" in i:
column_name.append(i.split('as')[-1])
else:
column_name.append(i.split(' ')[-1])
return column_name
你的问题是这里使用的SQL具有嵌套结构。在
最干净的解决方案是有一个能够理解MySQL方言的SQL解析器。可以说,使用ANTLR可以很容易地完成;如果您好奇,可以找到MySQL grammar here和quick guide here。在
要使用正则表达式来实现这一点,我们需要在如下匹配模式中使用递归正则表达式来解释平衡括号:
说明:
[^,]+(\((?>[^()]++|(?1))*+\))[^,]+
递归正则表达式,用于匹配()
和中间的所有内容(包括逗号)的对,该类由一个除逗号外的所有字符类匹配。在([^(),]+(?:,|$))
匹配常规列Demo
样本代码:
^{pr2}$输出:
因为我们使用的是pcreregex特性,所以您需要安装Python的替代regex包来运行代码。祝你好运。在
相关问题 更多 >
编程相关推荐