Приємно в теорії, жахливо на практиці
Під CSV я вважаю, що ви маєте на увазі конвенцію, описану в RFC 4180 .
При збігу основних даних CSV тривіально:
"data", "more data"
Примітка: BTW набагато ефективніше використовувати функцію .split ('/ n'). Split ('"') для дуже простих і добре структурованих даних, таких як. Державна машина), яка витрачає багато часу на відстеження часу, коли ви починаєте додавати крайові випадки, наприклад, знаки втечі.
Наприклад, ось найповніший рядок відповідності регулярного виразу, який я знайшов:
re_valid = r"""
# Validate a CSV string having single, double or un-quoted values.
^ # Anchor to start of string.
\s* # Allow whitespace before value.
(?: # Group for value alternatives.
'[^'\\]*(?:\\[\S\s][^'\\]*)*' # Either Single quoted string,
| "[^"\\]*(?:\\[\S\s][^"\\]*)*" # or Double quoted string,
| [^,'"\s\\]*(?:\s+[^,'"\s\\]+)* # or Non-comma, non-quote stuff.
) # End group of value alternatives.
\s* # Allow whitespace after value.
(?: # Zero or more additional values
, # Values separated by a comma.
\s* # Allow whitespace before value.
(?: # Group for value alternatives.
'[^'\\]*(?:\\[\S\s][^'\\]*)*' # Either Single quoted string,
| "[^"\\]*(?:\\[\S\s][^"\\]*)*" # or Double quoted string,
| [^,'"\s\\]*(?:\s+[^,'"\s\\]+)* # or Non-comma, non-quote stuff.
) # End group of value alternatives.
\s* # Allow whitespace after value.
)* # Zero or more additional values
$ # Anchor to end of string.
"""
Він обгрунтовано обробляє значення, що містяться в одному та подвійному значеннях, але не нові рядки у значеннях, котирування, що уникнули тощо.
Джерело: Переповнення стека - Як я можу розібрати рядок із JavaScript
Це стає кошмаром, коли вводяться загальні кейси, як ...
"such as ""escaped""","data"
"values that contain /n newline chars",""
"escaped, commas, like",",these"
"un-delimited data like", this
"","empty values"
"empty trailing values", // <- this is completely valid
// <- trailing newline, may or may not be included
Одного лише кращого випадку нового рядка як вартості достатньо, щоб зламати 99,9999% парсерів на основі RegEx, виявлених у дикій природі. Єдиною "розумною" альтернативою є використання узгодження RegEx для основного символу управління / неконтролювання (тобто термінал проти нетермінального) токенізації в парі з державною машиною, що використовується для аналізу вищого рівня.
Джерело: Досвід, інакше відомий як великий біль і страждання.
Я автор jquery-CSV , єдиного на базі javascript, повністю сумісного з RFC, CSV-аналізатора у світі. Я витрачав місяці на вирішення цієї проблеми, розмовляючи з багатьма розумними людьми і намагаючись багато, якщо різні реалізації, включаючи 3 повних переписки основного механізму аналізатора.
tl; dr - Мораль розповіді, PCRE поодинці піддається розбору будь-якого, крім самих простих і суворих регулярних граматик (тобто типу III). Хоча це корисно для токенізації термінальних та нетермінальних рядків.