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.