Desidero analizzare le righe di dati in arrivo simili al CSV. . I valori sono separati da virgole (e ci potrebbero essere iniziali e finali spazi bianchi intorno virgole), e possono essere citati sia con 'o con" Per esempio - questa è una riga valida:Espressione regolare di Python per la lettura di righe simili a CSV
data1, data2 ,"data3'''", 'data4""',,,data5,
ma questo non è corretto :
data1, data2, da"ta3", 'data4',
- virgolette possono essere precedute solo o trainati da spazi
Tali file malformati dovrebbero essere riconosciuti - meglio sarebbe quello di segnare in qualche modo il valore malformato all'interno di fila, ma se regex non corrisponde. anche l'intera riga è accettabile.
Sto provando a scrivere regex in grado di analizzarlo, utilizzando la corrispondenza() di findall(), ma ogni singola regex con cui sto arrivando ha alcuni problemi con i casi limite.
Quindi, forse qualcuno con esperienza nell'analisi di qualcosa di simile potrebbe aiutarmi in questo? (O forse questo è troppo complessa per regex e dovrei scrivere una funzione)
Edit1:
csv
modulo non è molto d'uso qui:
>>> 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'", '']]
- a meno che questo può essere sintonizzato?
EDIT2: Una lingua poche modifiche - Spero che sia più valida inglese ora
Edit3: Grazie per tutte le risposte, sono ormai abbastanza sicuro che l'espressione regolare non è che una buona idea anche qui (1) che copre tutti i casi limite possono essere complicati (2) l'output del writer non è regolare. Scrivendo ciò, ho deciso di controllare il pyparsing menzionato e usarlo o scrivere parser tipo FSM personalizzato.
Il modulo 'csv' * non può * essere" sintonizzato "per gestire le situazioni che descrivi. Anche il tuo primo esempio, con due diversi stili di virgolette, non può essere gestito, per quanto posso dire, nonostante tutte le persone che non possono essere disturbate a leggere attentamente la tua domanda. –
@Peter Hansen: sei corretto; il formato sopra descritto non può essere gestito dal modulo csv - non gestisce caratteri di virgolette alternativi. –
In alternativa, chiedere a chi prepara il file regex, utilizzare Tab Separated Values (TSV), in modo da poterlo leggere con csv.reader. – mootmoot