Разделить строку с разделителем в качестве пробела, но она сохраняет пробел в двойных кавычках, а также в двойных кавычках в Python - PullRequest
0 голосов
/ 08 ноября 2018

Разделить строку с разделителем в качестве пробела, но она должна сохранять пробел в двойных кавычках, а также двойные в Python

a='Append ",","te st1",input To output'

список вывода должен быть как ниже

['Append', '",","te st1",input', 'To', 'output']

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Очень простая функция генератора, поддерживающая текущее "состояние предложения":

def splitter(s):
    i, quoted = 0, False
    for n, c in enumerate(s+' '):
        if c == '"':
            quoted = not quoted
        elif c == ' ' and not quoted:
            if n > i:
                yield s[i:n]
            i = n+1

list(splitter(a))
# ['Append', '",","te st1",input', 'To', 'output']
0 голосов
/ 08 ноября 2018

Я нашел решение с помощью регулярных выражений:

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, так что я тоже жду этого ответа:)

...