Agréable en théorie, terrible en pratique
Par CSV, je vais supposer que vous entendez la convention décrite dans la RFC 4180 .
Bien que la correspondance des données CSV de base soit triviale:
"data", "more data"
Remarque: BTW, il est beaucoup plus efficace d'utiliser une fonction .split ('/ n'). Split ('"') pour des données très simples et bien structurées comme celle-ci. Les expressions régulières fonctionnent comme un NDFSM (Non-Deterministic Finite State Machine) qui gaspille beaucoup de temps à revenir en arrière une fois que vous commencez à ajouter des cas marginaux comme des caractères d'échappement.
Par exemple, voici la chaîne de correspondance d'expressions régulières la plus complète que j'ai trouvée:
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.
"""
Il gère raisonnablement les valeurs entre guillemets simples et doubles, mais pas les retours à la ligne des valeurs, les guillemets échappés, etc.
Source: Stack Overflow - Comment puis-je analyser une chaîne avec JavaScript
Cela devient un cauchemar une fois que les cas de bord communs sont introduits comme ...
"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
Le cas de bord de nouvelle ligne en tant que valeur suffit à lui seul à casser 99,9999% des analyseurs basés sur RegEx trouvés dans la nature. La seule alternative «raisonnable» consiste à utiliser la correspondance RegEx pour la tokenisation de caractère de contrôle / non-contrôle de base (c'est-à-dire terminal vs non-terminal) couplée à une machine d'état utilisée pour une analyse de niveau supérieur.
Source: Expérience autrement connue sous le nom de douleur et de souffrance étendues.
Je suis l'auteur de jquery-CSV , le seul analyseur CSV basé sur javascript et entièrement compatible RFC au monde. J'ai passé des mois à résoudre ce problème, à parler à de nombreuses personnes intelligentes et à essayer une tonne d'implémentations différentes, y compris 3 réécritures complètes du moteur de l'analyseur principal.
tl; dr - Morale de l'histoire, PCRE est nul à lui seul pour analyser tout sauf les grammaires régulières les plus simples et les plus strictes (c'est-à-dire de type III). Bien qu'il soit utile pour la tokenisation des chaînes terminales et non terminales.