Python: разбиение строки многозначным разделителем, если только внутри кавычек


В моем случае строка разделителя - ' ' (3 последовательных пробела, но ответ должен работать для любого многозначного разделителя), и текст крайнего регистра для поиска может быть следующим:

'Coord="GLOB"AL   Axis=X   Type="Y   ZR"   Color="Gray Dark"   Alt="Q   Z"qz   Loc=End'

Решение должно возвращать следующие строки:

Coord="GLOB"AL
Axis=X
Type="Y   ZR"
Color="Gray Dark"
Alt="Q   Z"qz
Loc=End

Я искал решения регулярных выражений, оценивая также обратную задачу (соответствует многосимвольному разделителю, если только внутри кавычек ), так как команда re.split Python 3.4.3 позволяет легко разбить текст по шаблону регулярных выражений, но я не уверен, что существует регулярное выражение, поэтому я открыт также для (эффективных) нерегексных решений.

Я видел некоторое решение обратной задачи с использованием lookahead / lookbehind, содержащего шаблон регулярных выражений, но они не работали, потому что Python lookahead/lookbehind (в отличие от других языков движка) требует шаблона фиксированной ширины.

Этот вопрос не является дубликатом из регулярных выражений, соответствующих пространствам, но не в "строках" или подобных других вопросах, потому что:

  1. сопоставление одного пространства вне кавычек отличается из сопоставлениямульти -символьного разделителя (в моем примере разделитель - это 3 пробела, но речь идет о любом многозначный разделитель);
  2. движок регулярных выражений Python немного отличается от C++ или других языки движков регулярных выражений;
  3. соответствующий разделитель в на мой вопрос, прямой вопрос речь идет о расщеплении строки.
1 2

1 ответ:

x='Coord="GLOB"AL   Axis=X   Type="Y   ZR"   Color="Gray Dark"   Alt="Q   Z"qz   Loc=End'
print re.split(r'\s+(?=(?:[^"]*"[^"]*")*[^"]*$)',x)

Вам нужно использовать lookahead, чтобы увидеть, если space это не между ""

Вывод ['Coord="GLOB"AL', 'Axis=X', 'Type="Y ZR"', 'Color="Gray Dark"', 'Alt="Q Z"qz', 'Loc=End']

Для обобщенной версии, если вы хотите split на delimiters не присутствует внутри "" Используйте

re.split(r'delimiter(?=(?:[^"]*"[^"]*")*[^"]*$)',x)