gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:01:57 27 4
gpt4 key购买 nike

我有一个嵌套的表达式如下

 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/ .一旦你有一个解析的 token 树,你就可以遍历它并执行你需要的操作:

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 )附加到结果列表中。

关于python - 解析嵌套函数以提取python中的每个内部函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66423239/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com