2008-09-22 26 views

cevap

24

Shlex modül çözümü kaçan alıntılara, bir alıntıdan diğerine kaçmasına ve tüm süslü malzeme kabuğu desteklerine izin verir. Feci Python'un Regex motoru ile aşina değilim gerçi

>>> 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'] 
+1

Bu, şartnamede olmayan üç ve dörde ayrılır. –

+0

Son "üç dört" yi bölmek için bir düzeltme gerekiyor. – tzot

+3

Sadece my_splitter.whitespace değiştirerek + = ',' to = ',' yapacak, ancak yine de her bir elemanı şeritlemeniz gerekiyor. –

5

Ayrıca csv modülünü de düşünmek isteyebilirsiniz. Denemedim, ama giriş verileriniz CSV'ye daha yakın gibi görünüyor, sözdizimi kabuksal sözdiziminden daha fazla (parıldayan ayrıntılar).

+0

Anlaşıldı. Oldukça standart CSV formatlama gibi görünen kapalı '' 'bölümleri, eksi. (Eh, bir CSV standardı olmadan mümkün olduğu kadar çok.) – jdmichal

+0

@jdmichal: '' 'sadece Python dizeleri alıntılamak için bir yoldur. – tzot

1

Böyle bir şey yapabileceğini: Bu güzel olmasına gerek yoksa

>>> 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'] 
-2

, bu yolda size sonuçları elde edebilirsiniz: Size istediğiniz kadar karmaşık bağlıdır

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('"'))], []) 
39

... birden fazla alıntı türüne izin vermek istiyor musunuz. Kaçan alıntılara ne dersin?

Kişisel sözdizimi Python standart kütüphanesi tarafından desteklenen ortak CSV dosyası biçiminde, çok benziyor:

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

Çıkışlar:

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

hth!

+1

Evet, csv modülü tam olarak burada istediğiniz şeydir. –

+3

Sadece bunu test ettim ve bir ısmarlıyorum. Shlex modülünden daha basit bir sözdizimi, bu yüzden oyumu alır! – DaGaMs

+0

güzel basit bir çözüm upvoted. – PythonTester

0

Ben, normal bir ifade burada aradığınızı olacağını söyleyebilirim:

>>> 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'] 

tırnak örneği kurtuldu.

Tembel eşleşmeler kullandığınızı varsayarak, dizenize yerleştirebileceğiniz bir dizi eşleşme elde edebilirsiniz.

İlgili konular