<p>我找到了一个使用正则表达式的解决方案:</p>
<pre><code>re.findall("(?:\".*?\"|\S)+", a)
</code></pre>
<p>给予</p>
<pre><code>['Append', '",","te st1",input', 'To', 'output']
</code></pre>
<p><strong>更新:</strong>改进的模式,包括转义:</p>
<pre><code>re.findall("(?:\".*?[^\\\"]\"|\S)+", a)
</code></pre>
<p>请注意,这还通过模式的<code>\S</code>部分匹配空字符串<code>""</code>。你知道吗</p>
<p><strong>注:</strong>出于存档目的,以下为旧答案:</p>
<p>显而易见的答案是这样使用<code>shlex</code>:</p>
<pre><code>>>> shlex.split('Append ",","te st1",input To output')
['Append', ',,te st1,input', 'To', 'output']
</code></pre>
<p>不幸的是,这将删除引号。总之,这种问题可以用一个简单的状态机来解决。性能可能低于标准,但它是有效的:</p>
<pre><code>#!/usr/bin/env python2
import string
def split_string_whitespace(s):
current_token = []
result = []
state = 0
for c in s + " ":
if state == 0:
if c in string.whitespace:
if current_token:
result.append("".join(current_token))
current_token = []
else:
current_token.append(c)
if c == '"':
state = 1
else:
current_token.append(c)
if c == '"':
state = 0
return result
print split_string_whitespace('Append ",","te st1",input To output')
</code></pre>
<p>脚本产生:</p>
<pre><code>['Append', '",","te st1",input', 'To', 'output']
</code></pre>
<p>我很确定可以用<code>re</code>子模块构造一些东西,所以我也在等待答案:)</p>