拆分逗号分隔符字符串,同时转义括号中的逗号分隔符字符串

2024-07-08 06:04:59 发布

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

我正在接收带有嵌入逗号的SQLDDL字符串以及values.e.x

org_id bigint,merc_name varchar(50),deposit_day date null,amount decimal(18,3),bank_name varchar(128)

这些SQL字符串值是从我们从其他应用程序接收的DDL文件中提取出来的(因此,我们目前无法要求其他团队从其末端修复它以转义嵌入的逗号)。我们希望输出为:

['org_id bigint', 'merc_name varchar(50)', 'deposit_day date null', 'amount decimal(18,3)', 'bank_name varchar(128)']

我尝试了csv模块,但是仍然没有逃逸值中嵌入的逗号。正则表达式是唯一的方法吗?你知道吗


Tags: 字符串nameorgiddateamountnullbank
2条回答

标记并使用最简单的状态机;这不会处理嵌套的括号,但对于这种情况已经足够了:

import re

def parse_sql_ddl(ddl):
    tokens = iter(re.findall('(\w+|[,() ])', ddl))
    current = []
    for token in tokens:
        if not token: continue  # zero-width start or end
        if token == ',':
            yield ''.join(current)
            current = []
        elif token == '(':
            current.append(token)
            for token in tokens:
                current.append(token)
                if token == ')':
                    break
        else:
            current.append(token)
    if current:
        yield ''.join(current)

这会将您的输入解析为标记(单词字符、逗号、括号和空格),然后生成完整的列声明:

>>> sample = 'org_id bigint,merc_name varchar(50),deposit_day date null,amount 
decimal(18,3),bank_name varchar(128)'
>>> for column in parse_sql_ddl(sample):
...     print column
... 
org_id bigint
merc_name varchar(50)
deposit_day date null
amount decimal(18,3)
bank_name varchar(128)

您可以扩展解析器来处理错误条件(current在有逗号时为空,或者在找到结束符)之前用完标记,等等)。它还可以很容易地扩展到处理带引号的名称(也可以包含括号和逗号!),再次添加一个嵌套循环,就像处理括号一样。你知道吗

使用正则表达式:

ddl = 'org_id bigint,merc_name varchar(50),deposit_day date null,amount decimal(18,3),bank_name varchar(128)'
print re.findall('(?:[^,(]|\(.*?\))+', ddl)

相关问题 更多 >

    热门问题