2016-06-16 9 views
1

eine Liste zu bilden:eine Zeichenfolge, bis ein leerer Raum analysieren in Python

Die "" oben zu zeigen, ist, dass es eine Zeichenfolge ist. Nun möchte ich diese string analysieren, bis ich die erste '' (ein leeres Element nach col3 im obigen Beispiel) und eine Liste mit Elementen vor diesem bilden. Also, basierend auf dem Beispielbeispiel über dem list, das ich bekommen sollte, wird ['col1', 'col2', 'col3'] sein. Wie kann ich dies in python tun?

Antwort

3

den String in eine Liste konvertieren und Listenoperationen verwenden, um die Zeichenfolge an den leeren String zu schneiden:

>>> s = "['col1', 'col2', 'col3','', 'row1', 'row2']" 
>>> import ast 
>>> L = ast.literal_eval(s) 
>>> L 
['col1', 'col2', 'col3', '', 'row1', 'row2'] 
>>> L.index('') 
3 
>>> L[:L.index('')] 
['col1', 'col2', 'col3'] 
+0

Zum ersten Mal sehe ich diese 'ast' Bibliothek. Scheint nützlich zu sein. – GLHF

+2

@GLHF es ist das "abstrakte Syntaxbaum" -Modul und versteht Pythons Grammatik. 'ast.literal_eval' ist eine sichere Form von' eval', die einen String evaluieren kann, der einen Python-Ausdruck enthält. Es wird zum Beispiel "del/s c: \ *" nicht ausgeführt. –

+0

wird "ast.literal_eval" auch in 'set, tuple' usw. konvertiert? – GLHF

0
import re 
import numpy as np 
l ="['col1', 'col2', 'col3','', 'row1', 'row2']" 
pattern = r"'([A-Za-z0-9_\./\\-]*)'" 
m = re.findall(pattern, l) 
mn = np.array(m) 
rslt = list(np.split(mn, np.where(mn==''))[0]) 

Ausgang:

rslt 
Out[75]: ['col1', 'col2', 'col3'] 

Erläuterung:

In [78]: pattern = r"'([A-Za-z0-9_\./\\-]*)'" 
    ...: m = re.findall(pattern, l) 
    ...: 

In [79]: m 
Out[79]: ['col1', 'col2', 'col3', '', 'row1', 'row2'] 

In [80]: mn = np.array(m) 

In [81]: [list(x) for x in np.split(mn, np.where(mn==''))] 
Out[81]: [['col1', 'col2', 'col3'], ['', 'row1', 'row2']] 
+0

@downvoter Könntest du bitte erklären, warum du runterstimmst? – MaThMaX

+0

Ich bin nicht der Downvoter, aber vielleicht haben sie bei der Verwendung von 'numpy' und' re' gebalkelt, wenn 'ast.literal_eval' ausreichend ist. – PaulMcG

+0

@PaulMcGuire, ich weiß, dass du es nicht bist, sonst würde ich dich zurückzahlen (haha, nur Spaß machen). Wie auch immer, "re" funktioniert für allgemeine Fälle von String-Parsing. Während für Sie in diesem speziellen Fall "Ast" am besten geeignet ist! Ich habe auch etwas Neues durch deine Frage gelernt! Vielen Dank! – MaThMaX

0

Ich wünschte, ich Ihren String direkt json mit analysieren könnte, aber wenn ich es tue, erhalte ich diese Fehlermeldung:

>>> import json 
>>> json.loads("['col1', 'col2', 'col3','', 'row1', 'row2']") 

... 
ValueError: No JSON object could be decoded 

Also, ich ersetzt zuerst die einfachen Anführungszeichen mit doppelten Anführungszeichen:

>>> s = "['col1', 'col2', 'col3','', 'row1', 'row2']" 
>>> m = json.loads(s.replace("'", '"')) 
>>> m 
[u'col1', u'col2', u'col3', u'', u'row1', u'row2'] 

# find first index of empty string and the splice the list 
>>> m[:m.index('')] 
[u'col1', u'col2', u'col3'] 
Verwandte Themen