<p>标记并使用最简单的状态机;这不会处理嵌套的括号,但对于这种情况已经足够了:</p>
<pre><code>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)
</code></pre>
<p>这会将您的输入解析为标记(单词字符、<em>或</em>逗号、括号和空格),然后生成完整的列声明:</p>
<pre><code>>>> 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)
</code></pre>
<p>您可以扩展解析器来处理错误条件(<code>current</code>在有逗号时为空,或者在找到结束符<code>)</code>之前用完标记,等等)。它还可以很容易地扩展到处理带引号的名称(也可以包含括号和逗号!),再次添加一个嵌套循环,就像处理括号一样。你知道吗</p>