Python: разделение строки, сохранение и сохранение котировок
Используя python, я хочу разбить следующую строку:
a=foo, b=bar, c="foo, bar", d=false, e="false"
Это приведет к следующему списку:
['a=foo', 'b=bar', 'c="foo, bar"', 'd=false', 'e="false'"']
При использовании shlex в posix-режиме и разбиении на "," аргумент для c
обрабатывается правильно. Однако он удаляет кавычки. Я нуждаюсь в них, потому что false
не то же самое, что "false"
, например.
Мой код:
import shlex
mystring = 'a=foo, b=bar, c="foo, bar", d=false, e="false"'
splitter = shlex.shlex(mystring, posix=True)
splitter.whitespace += ','
splitter.whitespace_split = True
print list(splitter) # ['a=foo', 'b=bar', 'c=foo, bar', 'd=false', 'e=false']
Ответы
Ответ 1
>>> s = r'a=foo, b=bar, c="foo, bar", d=false, e="false", f="foo\", bar"'
>>> re.findall(r'(?:[^\s,"]|"(?:\\.|[^"])*")+', s)
['a=foo', 'b=bar', 'c="foo, bar"', 'd=false', 'e="false"', 'f="foo\\", bar"']
- Шаблон регулярного выражения
"[^"]*"
соответствует простой кавычки.
-
"(?:\\.|[^"])*"
соответствует кавычки и пропускает кавычки, потому что \\.
потребляет два символа: обратную косую черту и любой символ.
-
[^\s,"]
соответствует не ограничителю.
- Сочетание шаблонов 2 и 3 внутри
(?: | )+
соответствует последовательности без разделителей и кавычек, что является желаемым результатом.
Ответ 2
Regex может решить это достаточно легко:
import re
mystring = 'a=foo, b=bar, c="foo, bar", d=false, e="false"'
splitString = re.split(',?\s(?=\w+=)',mystring)
Образец regex здесь ищет пробелы, за которыми следует символ слова, а затем знак равенства, который разбивает вашу строку по вашему желанию и поддерживает любые кавычки.