Подтвердить что ты не робот

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']
4b9b3361

Ответ 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 здесь ищет пробелы, за которыми следует символ слова, а затем знак равенства, который разбивает вашу строку по вашему желанию и поддерживает любые кавычки.