2011-10-24 4 views
9

Python dizesi işlevi split() işlevini kullanırken, çift tırnak işareti ile çevrelenmiş öğeleri bir bölme olmayan sözcük olarak işlemek için bir hileli hile var mı? Python dizgisi split() ile çift tırnaklı kelimeleri ayırmayın.

Ben sadece boşluk üzerinde bölmek istediğini farz edelim ve bu var:

>>> myStr = 'A B\t"C" DE "FE"\t\t"GH I JK L" "" ""\t"O P Q" R' 
>>> myStr.split() 
['A', 'B', '"C"', 'DE', '"FE"', '"GH', 'I', 'JK', 'L"', '""', '""', '"O', 'P', 'Q"', 'R'] 
Beyaz boşluklar gömülü bile, tek bir kelime olarak çift tırnak içinde herhangi bir tedavi etmek ister, yani ediyorum

olur aşağıdaki ile bitirmek istiyorum:

['A', 'B', 'C', 'DE', 'FE', 'GH I JK L', '', '', 'O P Q', 'R'] 

Ya da en azından bu ve sonra kapalı şerit olacak çift tırnak:

['A', 'B', '"C"', 'DE', '"FE"', '"GH I JK L"', '""', '""', '"O P Q"', 'R'] 

Düzenli olmayan önerileriniz var mı?

cevap

30

Kazandınız . 't str.split() bu davranışı elde edebilmek Eğer (ters eğik çizgi öncesinde çift tırnak görmezden gibi) yapar oldukça karmaşık ayrıştırma ile yaşayabilir, shlex.split() aradığınız ne olabileceğini:

>>> shlex.split(myStr) 
['A', 'B', 'C', 'DE', 'FE', 'GH I JK L', '', '', 'O P Q', 'R'] 
+2

+100, vay, shumbu hiç duymadım –

+1

Teşekkür ederim Sven --- tam olarak aradığım şey! – Rob

+0

harika, çok yararlı. Teşekkürler! – liang

0

ben * "[^"] Eğer desen için re ile arama önermek" ve geriye kalan tek parçalarda String.split geçerlidir. Sen tüm ilgili dize parçalarını işleyen bir özyinelemeli işlevi uygulamak olabilir.

1

@Rob: regexp çözümü neden bu kadar basit ise regex olmadan?

my_str = 'A B\t"C" DE "FE"\t\t"GH I JK L" "" ""\t"O P Q" R' 
print re.findall(r'(\w+|".*?")', my_str) 
['A', 'B', '"C"', 'DE', '"FE"', '"GH I JK L"', '""', '""', '"O P Q"', 'R'] 
+0

+1 Çok güzel bir çözüm! – hochl

+0

@PabloG - Sık sık başlarda kolay bir çözüm olmakla birlikte, regex'in daha uzun vadeli maliyetlere sahip olmadığı bir dava ile şahsen karşılaşmadım. Bu özel durumla ilgili olarak, bunun çözülmüş bir problem olduğunu ve sadece onu bulabileceğinden emindim --- --- göründüğü gibi Sven bana doğru yönde parıltıyla işaret etti. – Rob