Frage

Ich muss in der Lage, eine Zeichenfolge zu nehmen wie:

'''foo, bar, "one, two", three four'''

in:

['foo', 'bar', 'one, two', 'three four']

Ich habe ein Gefühl (mit einem Hauch von #python), dass die Lösung des shlex Modul einzubinden wird.

War es hilfreich?

Lösung

Die shlex Modullösung ermöglicht entkommen Anführungszeichen, ein Zitat ein anderer zu entkommen, und alle fancy stuff Shell unterstützt.

>>> import shlex
>>> my_splitter = shlex.shlex('''foo, bar, "one, two", three four''', posix=True)
>>> my_splitter.whitespace += ','
>>> my_splitter.whitespace_split = True
>>> print list(my_splitter)
['foo', 'bar', 'one, two', 'three', 'four']

entkam Anführungszeichen Beispiel:

>>> my_splitter = shlex.shlex('''"test, a",'foo,bar",baz',bar \xc3\xa4 baz''',
                              posix=True) 
>>> my_splitter.whitespace = ',' ; my_splitter.whitespace_split = True 
>>> print list(my_splitter)
['test, a', 'foo,bar",baz', 'bar \xc3\xa4 baz']

Andere Tipps

Es hängt davon ab, wie kompliziert Sie erhalten möchten ... tun Sie mehr als eine Art des Zitierens zulassen möchten. Wie wäre es entgangen Zitate?

Ihre Syntax sieht sehr ähnlich wie das gemeinsamen CSV-Dateiformat, das von der Python-Standardbibliothek unterstützt:

import csv
reader = csv.reader(['''foo, bar, "one, two", three four'''], skipinitialspace=True)
for r in reader:
  print r

Ausgänge:

['foo', 'bar', 'one, two', 'three four']

HTH!

Sie können auch die csv Modul zu berücksichtigen. Ich habe nicht versucht, aber es sieht aus wie Ihre Eingabedaten in einer CSV ist näher als Shell-Syntax (das, was shlex Parsen ist).

Sie können etwas tun:

>>> import re
>>> pattern = re.compile(r'\s*("[^"]*"|.*?)\s*,')
>>> def split(line):
...  return [x[1:-1] if x[:1] == x[-1:] == '"' else x
...          for x in pattern.findall(line.rstrip(',') + ',')]
... 
>>> split("foo, bar, baz")
['foo', 'bar', 'baz']
>>> split('foo, bar, baz, "blub blah"')
['foo', 'bar', 'baz', 'blub blah']

würde ich sagen, ein regulärer Ausdruck sei, was Sie hier suchen, obwohl ich mit Python nicht sehr vertraut bin Regex-Engine.

Angenommen, Sie faul Streichhölzer verwenden, können Sie einen Satz von Übereinstimmungen auf einer Schnur bekommen, die Sie in Ihrem Array setzen können.

Wenn es nicht schön sein muss, könnte dies Sie auf Ihrem Weg:

def f(s, splitifeven):
    if splitifeven & 1:
        return [s]
    return [x.strip() for x in s.split(",") if x.strip() != '']

ss = 'foo, bar, "one, two", three four'

print sum([f(s, sie) for sie, s in enumerate(ss.split('"'))], [])
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top