Я нашел решение с помощью регулярных выражений:
re.findall("(?:\".*?\"|\S)+", a)
дает
['Append', '",","te st1",input', 'To', 'output']
Обновление: Улучшенный шаблон, включающий экранирование:
re.findall("(?:\".*?[^\\\"]\"|\S)+", a)
Обратите внимание, что это также соответствует пустой строке ""
с помощью \S
части шаблона.
Примечание: Старый ответ ниже для архивных целей:
Очевидный ответ - использовать shlex
так:
>>> shlex.split('Append ",","te st1",input To output')
['Append', ',,te st1,input', 'To', 'output']
Это, к сожалению, удалит кавычки. В любом случае, такую проблему можно решить с помощью простого конечного автомата. Производительность может быть ниже нормы, но она работает:
#!/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')
Скрипт выдает:
['Append', '",","te st1",input', 'To', 'output']
Я почти уверен, что можно создать что-то с помощью подмодуля re
, так что я тоже жду этого ответа:)