2011-10-24 12 views
9

Czy przy użyciu funkcji łańcuchowej Python split(), ktoś ma świetną sztuczkę do traktowania elementów otoczonych podwójnymi cudzysłowami jako niezaprzeczalne słowo?Nie dziel słowa podwójnego cytowania za pomocą łańcucha znaków Python()?

że chcę podzielić tylko na białej przestrzeni i mam to:

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

Chciałbym traktować coś w podwójnych cudzysłowach jako jedno słowo, nawet jeśli spacji są osadzone, tak by lubię skończyć z niżej:

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

lub przynajmniej to, a potem będę obetniesz podwójnych cudzysłowach:

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

Wszelkie sugestie inne niż wyrażenie regularne?

Odpowiedz

30

Wygrałeś . „t być w stanie uzyskać to zachowanie z str.split() Jeśli można żyć z dość skomplikowanej analizy składniowej to robi (jak ignorowanie cudzysłowów poprzedzone tylnym ukośnikiem) shlex.split() może być to, czego szukasz:

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

+100, wow, nigdy nie słyszałem o Shlexie –

+1

Dziękuję Sven --- właśnie tego szukam! – Rob

+0

niesamowite, bardzo pomocne. Dzięki! – liang

0

Proponuję poszukać ty z re na wzór „[^”] *”i zastosować String.split tylko na pozostałych częściach. Można realizować funkcji rekurencyjnej, który przetwarza wszystkie istotne elementy ciągów.

1

@Rob: dlaczego bez wyrażeń regularnych, jeśli rozwiązanie regexp jest tak proste?

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 Bardzo ładne rozwiązanie! – hochl

+0

@PabloG - Mimo, że często jestem łatwym rozwiązaniem, muszę jeszcze osobiście spotkać się z przypadkiem, w którym regex nie miał więcej długoterminowych kosztów. Jeśli chodzi o ten konkretny przypadek, byłem prawie pewien, że to był problem rozwiązany i po prostu mogłem go znaleźć --- wygląda na to, że Sven skierował mnie we właściwą stronę z shlexem. – Rob

Powiązane problemy