Разделить строку по запятым, игнорируя запятые внутри двойных кавычек?
У меня есть входные данные, которые выглядят следующим образом:
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 ответ(ов)
Если вы ищете решение на основе регулярных выражений, простым вариантом может быть разбивание строки на запятые (,
) или символы в кавычках ("(.*?)"
); затем отфильтровать пустые значения.
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]))
Разделить строку по пробелам в Python
Фильтрация DataFrame pandas по критериям подстроки
Как преобразовать строку, разделённую запятыми, в массив?
Разделение строк на слова с использованием нескольких разделителей границ слов
Простой способ удалить несколько пробелов в строке?