2008-09-22 2 views

답변

24

shlex 모듈 솔루션을 사용하면 이스케이프 된 따옴표, 한 따옴표로 다른 이스케이프 문자 및 모든 멋진 물건 쉘을 지원할 수 있습니다. 내가 정말 파이썬의 정규식 엔진을 잘 모르겠지만

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

이것은 사양에없는 3과 4를 나눕니다. –

+0

최종 "three four"분할을위한 수정이 필요합니다. – tzot

+3

단순히 my_splitter.whitespace + = ','= ','로 변경하면되지만 각 요소를 제거해야합니다. –

5

csv 모듈을 고려해 볼 수도 있습니다. 나는 그것을 시도하지는 않았지만 입력 데이터가 쉘 구문 (shlex 구문 분석)보다 CSV에 더 가깝습니다.

+0

동의. 둘러싸는 '' '부분을 제외하고는 꽤 표준 CSV 형식으로 보입니다. (글쎄 CSV 표준없이 할 수있는 한 많이) – jdmichal

+0

@jdmichal : '' '는 파이썬에서 문자열을 인용하는 방법 일뿐입니다. – tzot

1

당신이 뭔가를 할 수 있습니다 : 그것은 꽤 할 필요가없는 경우

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

, 이것은 당신의 방법에 당신을 얻을 수 있습니다 : 그것은 당신이 원하는 방법 복잡한 따라

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

get ... 여러 유형의 인용을 허용 하시겠습니까? 어쨌든 이스케이프 된 따옴표는?

귀하의 구문은 파이썬 표준 라이브러리에서 지원하는 일반적인 CSV 파일 형식, 같은 매우 같습니다

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

출력을 :

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

HTH를!

+1

그래, csv 모듈은 당신이 원하는 곳이다. –

+3

그냥 테스트하고 치료를 작동합니다. shlex 모듈보다 더 간단한 구문입니다. 그래서 이것은 내 표를 얻습니다! – DaGaMs

+0

좋은 간단한 해결책 upvoted. – PythonTester

0

내가, 정규 표현식 당신이 여기 찾고있는 것 말하고 싶지만 :

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

따옴표 예를 탈출했다.

게으른 일치를 사용한다고 가정하면 배열에 넣을 수있는 문자열에 일치하는 항목을 가져올 수 있습니다.

관련 문제