Разбиваем строку с пробелами, без пробелов-разделение элементов в двойных кавычках


Мне нужно разделить команду:

r'  "C:\Program Files (x86)\myeditor" "$FILEPATH" -n$LINENO "c:\Program Files" -f$FILENAME -aArg2'`

в:

['"C:\\Program Files (x86)\\myeditor"',
 '"$FILEPATH"',
 '-n$LINENO',
 '"c:\\Program Files"',
 '-f$FILENAME',
 '-aArg2']

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

У меня есть этот код:

import re

s = r'  "C:\Program Files (x86)\myeditor" "$FILEPATH" -n$LINENO "c:\Program Files" -f$FILENAME -aArg2'

start = end = 0
split = []

for elem in re.findall('".*?"', s):
    end = s.find(elem)
    split.append(s[start:end])
    split.append(elem)
    start = end + len(elem)

split.extend(s[start:].split())
split = [elem.strip() for elem in split]
split = list(filter(None, split))

Это работает, но я интересно, если есть более элегантный/короче/более четкий способ сделать это в Python(3) ?



2587
9
задан 6 апреля 2018 в 09:04 Источник Поделиться
Комментарии
2 ответа

Лучший способ сделать то, что вы хотите со стандартной библиотекой будет shlex.сплит():

>>> import shlex
>>> s = r' "C:\Program Files (x86)\myeditor" "$FILEPATH" -n$LINENO "c:\Program Files" -f$FILENAME -aArg2'
>>> shlex.split(s)
['C:\\Program Files (x86)\\myeditor', '$FILEPATH', '-n$LINENO', 'c:\\Program Files', '-f$FILENAME', '-aArg2']

Обратите внимание, что кавычки не сохраняются.

11
ответ дан 6 апреля 2018 в 11:04 Источник Поделиться

Вы можете использовать различные выражения:

import re

s = r' "C:\Program Files (x86)\myeditor" "$FILEPATH" -n$LINENO "c:\Program Files" -f$FILENAME -aArg2'

pattern = re.compile(r"((\"[^\"]+\")|(-[^\s]+))")

for m in re.finditer(pattern, s):
print(m.group(0))

Это регулярное выражение будет соответствовать любой элемент, заключенный в двойные кавычки (") или элемент предваряется тире (-).

Однако это может быть труднее читать/понять, и я также не уверен, если это является для Python , как и Perl способ делать вещи, так что возьмите это с зерном соли.

4
ответ дан 6 апреля 2018 в 10:04 Источник Поделиться