Je souhaite analyser les lignes de données CSV entrantes. . Les valeurs sont séparées par des virgules (et il pourrait y avoir avant et arrière espaces blancs autour des virgules), et peuvent être cités soit avec "ou » Par exemple - c'est une ligne valide:Expression régulière Python pour lire les lignes de type CSV
data1, data2 ,"data3'''", 'data4""',,,data5,
mais celui-ci est malformé :
data1, data2, da"ta3", 'data4',
- entre guillemets ne peuvent être préfixés ou traînés par des espaces
Ces lignes malformés doivent être reconnues - mieux serait de marquer en quelque sorte la valeur malformé dans les rangs, mais si regex ne correspond pas. toute la rangée, alors c'est aussi acceptable
J'essaie d'écrire regex capable d'analyser ceci, en utilisant soit match() de findall(), mais chaque regex que je viens avec a quelques problèmes avec les cas de bordure. Donc, peut-être quelqu'un ayant de l'expérience dans l'analyse de quelque chose de similaire pourrait m'aider à ce sujet? (Ou peut-être cela est trop complexe pour regex et je devrais écrire une fonction)
EDIT1:
Module csv
est pas beaucoup d'utilisation ici:
>>> list(csv.reader(StringIO('''2, "dat,a1", 'dat,a2',''')))
[['2', ' "dat', 'a1"', " 'dat", "a2'", '']]
>>> list(csv.reader(StringIO('''2,"dat,a1",'dat,a2',''')))
[['2', 'dat,a1', "'dat", "a2'", '']]
- à moins que cela peut être réglé?
EDIT2: Quelques modifications langue - j'espère que ce sera plus valide anglais maintenant
EDIT3: Merci pour toutes les réponses, je suis maintenant assez sûr que l'expression régulière n'est pas une bonne idée ici (1) couvrant tous les cas de bord peuvent être difficiles (2) la sortie de l'auteur n'est pas régulière. En écrivant cela, j'ai décidé de vérifier le pypars mentionné et de l'utiliser, ou d'écrire un analyseur personnalisé de type FSM.
Le module 'csv' * ne peut pas * être" réglé "pour gérer les situations que vous décrivez. Même votre premier exemple, avec deux styles différents de guillemets, ne peut pas être traité, pour autant que je sache, nonobstant toutes les personnes qui ne peuvent pas prendre la peine de lire votre question à fond. –
@Peter Hansen: vous avez raison; le format décrit ci-dessus ne peut pas être géré par le module csv - il ne gère pas les caractères de citation alternatifs. –
En alternative, demandez à celui qui prépare le fichier regex, utilisez les valeurs séparées par des tabulations (TSV), afin de pouvoir le lire avec csv.reader. – mootmoot