解析嵌套函数以提取python中的每个内部函数

2024-09-26 18:10:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个嵌套表达式,如下所示

 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" ))'

我的代码中这个表达式的结果将是正确的。 在第一个表达式中,我提到,操作符中有,而不是,“因此我的代码不起作用

请帮忙


Tags: 代码nameintestif表达式positionfunction
1条回答
网友
1楼 · 发布于 2024-09-26 18:10:01

如果您希望它是可靠的,您需要一个成熟的SQL解析器。幸运的是,有一个现成的解决方案:https://pypi.org/project/sqlparse/。一旦您有了一个已解析的令牌树,您就可以遍历它并执行您需要的操作:

import sqlparse

def extract_functions(tree):
    res = []
    def visit(token):
        if token.is_group:
            for child in token.tokens:
                visit(child)
        if isinstance(token, sqlparse.sql.Function):
            res.append(token.value)
    visit(tree)
    return res

extract_functions(sqlparse.parse(expression)[0])

解释。 sqlparse.parse(expression)解析字符串并返回语句的元组。由于示例中只有一条语句,我们可以只使用第一个元素。如果有许多语句,则应该迭代所有元组元素

extract_functions首先使用token.is_group递归遍历已解析的标记树深度(因为您希望内部调用出现在外部调用之前),以确定当前标记是否为叶,测试当前标记是否为函数,如果是,则将其字符串表示形式(token.value)附加到结果列表中

相关问题 更多 >

    热门问题