Bello in teoria, terribile in pratica
Per CSV suppongo che intendi la convenzione come descritto in RFC 4180 .
Mentre la corrispondenza dei dati CSV di base è banale:
"data", "more data"
Nota: A proposito, è molto più efficiente utilizzare una funzione .split ('/ n'). Split ('"') per dati molto semplici e ben strutturati come questo. Le espressioni regolari funzionano come NDFSM (non deterministico finito State Machine) che fa perdere molto tempo indietro quando si inizia ad aggiungere casi limite come i caratteri di escape.
Ad esempio, ecco la stringa di corrispondenza delle espressioni regolari più completa che ho trovato:
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.
"""
Gestisce ragionevolmente valori tra virgolette singole e doppie, ma non newline in valori, virgolette di escape, ecc.
Fonte: StackTranslate.it - Come posso analizzare una stringa con JavaScript
Diventa un incubo una volta introdotti i casi limite comuni come ...
"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
Il solo caso limite come valore di riga da solo è sufficiente per interrompere il 99,9999% dei parser basati su RegEx trovati in natura. L'unica alternativa "ragionevole" è quella di utilizzare la corrispondenza RegEx per la tokenizzazione di base di controllo / non controllo (ovvero terminale vs non terminale) accoppiata con una macchina a stati utilizzata per analisi di livello superiore.
Fonte: esperienza altrimenti nota come dolore e sofferenza estesi.
Sono l'autore di jquery-CSV , l'unico parser CSV basato su javascript, completamente conforme a RFC, al mondo. Ho trascorso mesi ad affrontare questo problema, parlando con molte persone intelligenti e provando moltissime implementazioni diverse tra cui 3 riscritture complete del motore di analisi principale.
tl; dr - Morale della storia, PCRE da solo fa schifo per l'analisi di qualsiasi cosa tranne le grammatiche regolari più semplici e rigorose (Ie Tipo III). Sebbene sia utile per tokenizzare stringhe terminali e non terminali.