python - 在 Python 中拆分可能嵌套的函数表达式列表

标签 python list split

PostgreSQL 允许在表达式上创建索引,例如,CREATE INDEX ON films ((lower(title)))。它还具有一个 pg_get_expr() 信息函数,可将表达式的内部格式转换为文本,即前一个示例中的 lower(title)。表情有时会变得很毛茸茸。以下是一些示例(使用 Python):

sample_exprs = [
    'lower(c2)',
    'lower(c2), lower(c3)',
    "btrim(c3, 'x'::text), lower(c2)",
    "date_part('month'::text, dt), date_part('day'::text, dt)",
    '"substring"(c2, "position"(c2, \'_begin\'::text)), "substring"(c2, "position"(c2, \'_end\'::text))',
    "(((c2)::text || ', '::text) || c3), ((c3 || ' '::text) || (c2)::text)",
    'f1(f2(arga, f3()), arg1), f4(arg2, f5(argb, argc)), f6(arg3)']

最后一项并非真正来自 Postgres,而只是我的代码应该处理的一个极端示例。

我编写了一个 Python 函数来将文本列表拆分为组件表达式。例如,最后一项被分解为:

 f1(f2(arga, f3()), arg1)
 f4(arg2, f5(argb, argc))
 f6(arg3)

我尝试了 str 方法,比如 find()count() 也考虑了正则表达式,但最后我写了一个函数这就是我用 C 编写的内容(基本上计算打开和关闭括号以找到中断文本的位置)。这是函数:

def split_exprs(idx_exprs):
    keyexprs = []
    nopen = nclose = beg = curr = 0
    for c in idx_exprs:
        curr += 1
        if c == '(':
            nopen += 1
        elif c == ')':
            nclose += 1
            if nopen > 0 and nopen == nclose:
                if idx_exprs[beg] == ',':
                    beg += 1
                if idx_exprs[beg] == ' ':
                    beg += 1
                keyexprs.append(idx_exprs[beg:curr])
                beg = curr
                nopen = nclose = 0
    return keyexprs

问题是是否有更 Pythonic 或更优雅的方法来执行此操作或使用正则表达式来解决此问题。

最佳答案

这是我的版本,我认为它更像 pythonic,更简洁,并且适用于 chars 流,尽管我看不出有任何优势:)

def split_fns(fns):
    level = 0
    stack = [[]]
    for ch in fns:
        if level == 0 and ch in [' ',',']:
            continue        
        stack[-1].append(ch)

        if ch == "(":
            level += 1
        elif ch == ")":
            level -= 1
            if level == 0:
                stack.append([])

    return ["".join(t) for t in stack if t]

关于python - 在 Python 中拆分可能嵌套的函数表达式列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12923733/

相关文章:

python - 3个嵌套循环: Optimizing a simple simulation for speed

python - 在 Python 中比较字节

Python openpyxl load_workbook 错误 : TypeError (NoneType not Iterable) and ValueError (Max. 值为 180)

javascript.split 未返回预期值

JavaScript - 拆分字符串

python - 使用 Python 创建具有多列的 HTML 表格

c# - 林克/C# : How to split List into variable length chunks based on list item information?

java - 从给定列表中选择随机字符串

python - 迭代时从列表中删除时会跳过迭代

string - Elisp split-string 函数用于按 分割字符串。特点