Bello in teoria, terribile nella pratica
Per CSV assumerò che intendi la convenzione come descritto in RFC 4180 .
Mentre abbinare i dati CSV di base è banale:
"data", "more data"
Nota: BTW, è molto più efficiente usare una funzione .split ('/ n'). split ('"') per dati molto semplici e ben strutturati come questo. NDFSM (Macchina a stati finiti non deterministica) che spreca un sacco di tempo indietro nel backtracking una volta che inizi ad aggiungere casi limite come escape char.
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 con quotazioni singole e doppie, ma non con ritorni a capo in valori, citazioni con escape, ecc.
Fonte: Overflow dello stack - Come posso analizzare una stringa con JavaScript
Diventa un incubo una volta che i casi limite comuni vengono introdotti 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 caso limite newline-as-value da solo è sufficiente a rompere il 99,9999% dei parser basati su RegEx trovati in natura. L'unica alternativa "ragionevole" consiste nell'utilizzare la corrispondenza di RegEx per la tokenizzazione di controllo di base / non di controllo (ad esempio terminale vs non terminale) associata a una macchina a stati utilizzata per l'analisi di livello superiore.
Fonte: esperienza altrimenti nota come intenso dolore e sofferenza.
Sono l'autore di jquery-CSV , l'unico basato su javascript, completamente RFC- parser compatibile con CSV nel mondo. Ho trascorso mesi ad affrontare questo problema, parlando con molte persone intelligenti e provando un sacco di diverse implementazioni, tra cui 3 riscritture complete del motore parser principale.
tl; dr - Morale della trama, PCRE da solo fa schifo per analizzare tutto tranne le grammatiche più semplici e rigide (Ie tipo III). Anche se, è utile per tokenizzare le stringhe terminale e non-terminale.