0

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

14

У меня есть входные данные, которые выглядят следующим образом:

A,B,C,"D12121",E,F,G,H,"I9,I8",J,K

Значения, разделенные запятыми, могут быть в любом порядке. Я хочу разделить строку по запятым; однако в случае, если что-то находится внутри двойных кавычек, мне нужно игнорировать запятые и убрать кавычки. В итоге я хотел бы получить следующий список строк:

['A', 'B', 'C', 'D12121', 'E', 'F', 'G', 'H', 'I9,I8', 'J', 'K']

Как мне это реализовать?

1 ответ(ов)

0

Если вы ищете решение на основе регулярных выражений, простым вариантом может быть разбивание строки на запятые (,) или символы в кавычках ("(.*?)"); затем отфильтровать пустые значения.

import re

s = 'A,B,C,"D12121",E,F,G,H,"I9,I8",J,K'
splits = list(filter(None, re.split(r',|"(.*?)"', s)))
# ['A', 'B', 'C', 'D12121', 'E', 'F', 'G', 'H', 'I9,I8', 'J', 'K']

Другим вариантом может быть использование re.findall() с шаблоном, который захватывает либо символы в кавычках ("(.*?)"), либо символы, не являющиеся запятыми (([^,]+)). Это создаст список из кортежей, где одно из значений будет пустой строкой, поэтому просто объединив эти кортежи, вы получите нужный результат.

splits = list(map(''.join, re.findall(r'"(.*?)"|([^,]+)', s)))
# ['A', 'B', 'C', 'D12121', 'E', 'F', 'G', 'H', 'I9,I8', 'J', 'K']

Тем не менее, я считаю, что стандартная библиотека csv — это лучшее решение для данной задачи. Учтите, что csv.reader ожидает список строк, поэтому, если вы хотите разбить одну строку, оберните её в функцию.

import csv

splits = next(csv.reader([s]))
Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь