2011-10-24 2 views
9

파이썬 문자열 함수 split()을 사용할 때 큰 따옴표로 묶인 항목을 비분 할 단어로 처리하는 사람이 있습니까? 큰 따옴표로 묶은 단어를 파이썬 문자열 split()로 분할하지 마십시오?

내가 공백 만에 분할 할 말 나는이 있습니다

>>> 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'] 
내가 공백이 포함 된 경우에도, 하나의 단어로 큰 따옴표 안에 아무것도 치료에 좋아, 그래서 것

는 것을 아래로 끝날 싶은 :

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

또는 적어도이 다음 내가 벗겨거야 따옴표 :

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

정규식이 아닌 제안 사항이 있습니까?

답변

30

당신은 원 . '는 t이 str.split()으로이 동작을 얻을 수있을 당신이 (백 슬래시 앞에 따옴표를 무시 등) 수행하는 다소 복잡한 구문 분석을 살 수 있다면, shlex.split() 당신이 찾고있는 수 있습니다 무엇 :

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

+100 와우, 결코 들어 본 적 없음 –

+1

감사합니다. Sven --- 그것이 내가 찾고있는 것입니다! – Rob

+0

대단히 유용합니다. 감사! – liang

0

나는 * "[^"] 당신이 패턴 re으로 검색 제안 "만 나머지 부분에 대한 사항 String.split을 적용 할 수 있습니다. 당신은 모든 관련 문자열 부분을 처리하는 재귀 함수를 구현할 수있다.

1

@ 로봇 : 정규식 솔루션이 너무 단순한 이유는 무엇입니까?

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 아주 좋은 해결책! – hochl

+0

@PabloG - 종종 앞선 쉬운 솔루션 임에도 불구하고 정규식에 장기적인 비용이 들지 않는 경우가 발생했습니다. 이 특별한 경우에 관해서는, 이것이 문제가 해결되었다는 것을 확실히 알고 있었고, 나는 그것을 발견 할 수있었습니다. 스벤은 shlex와 함께 올바른 방향으로 나를 지적했습니다. – Rob

관련 문제