我有一个嵌套表达式,如下所示
expression = 'position(\'a\' IN Concat("function_test"."PRODUCT_CATEGORIES"."CATEGORY_NAME" , "function_test"."PRODUCT_CATEGORIES"."CATEGORY_NAME" ))'
我希望通过首先检索嵌套函数,然后检索外部函数来获得输出
['Concat("function_test"."PRODUCT_CATEGORIES"."CATEGORY_NAME" , "function_test"."PRODUCT_CATEGORIES"."CATEGORY_NAME" )','position(\'a\' IN Concat("function_test"."PRODUCT_CATEGORIES"."CATEGORY_NAME" , "function_test"."PRODUCT_CATEGORIES"."CATEGORY_NAME" ))']
下面是我尝试过的代码
result = []
for i in range(len(expression)):
if expression[i]=="(":
a.append(i)
elif expression[i]==")":
fromIdx=a.pop()
fromIdx2=max(a[-1],expression.rfind(",", 0, fromIdx))
flag=False
for (fromIndex, toIndex) in first_Index:
if fromIdx2 + 1 >= fromIndex and i <= toIndex:
flag=True
break
if flag==False:
result.append(expression[fromIdx2+1:i+1])
但只有当表达式被分隔,“ 例如:
expression = 'position(\'a\' , Concat("function_test"."PRODUCT_CATEGORIES"."CATEGORY_NAME" , "function_test"."PRODUCT_CATEGORIES"."CATEGORY_NAME" ))'
我的代码中这个表达式的结果将是正确的。 在第一个表达式中,我提到,操作符中有,而不是,“因此我的代码不起作用
请帮忙
如果您希望它是可靠的,您需要一个成熟的SQL解析器。幸运的是,有一个现成的解决方案:https://pypi.org/project/sqlparse/。一旦您有了一个已解析的令牌树,您就可以遍历它并执行您需要的操作:
解释。
sqlparse.parse(expression)
解析字符串并返回语句的元组。由于示例中只有一条语句,我们可以只使用第一个元素。如果有许多语句,则应该迭代所有元组元素extract_functions
首先使用token.is_group
递归遍历已解析的标记树深度(因为您希望内部调用出现在外部调用之前),以确定当前标记是否为叶,测试当前标记是否为函数,如果是,则将其字符串表示形式(token.value
)附加到结果列表中相关问题 更多 >
编程相关推荐