2011-01-14 4 views
7

파이썬에서는 구분 기호 목록을 사용하여 문자열을 분할하고 싶습니다. 구분 기호는 쉼표 또는 세미콜론 중 하나 일 수 있습니다. 공백 문자가 아닌 공백 문자가 아닌 경우 공백 문자를 제거해야합니다.이 경우 공백 문자를 보존해야합니다.파이썬 : 구분 기호 목록으로 문자열 분할

테스트 케이스 1 : ABC,DEF123,GHI_JKL,MN OP
테스트 케이스 2 : ABC;DEF123;GHI_JKL;MN OP
테스트 케이스 (3) : ABC ; DEF123,GHI_JKL ; MN OP

괜찮 정규 표현식의 경우처럼 들리지만, 쉽게 또는 청소기의 경우 다른 방법을 수행하는 그게 더 나아질거야.

감사합니다. 정규 표현식을 사용

답변

15

이 훨씬 더 빨리 정규식 다음해야하며, 당신이 원하는대로 seperators의 목록을 전달할 수 있습니다

def split(txt, seps): 
    default_sep = seps[0] 

    # we skip seps[0] because that's the default seperator 
    for sep in seps[1:]: 
     txt = txt.replace(sep, default_sep) 
    return [i.strip() for i in txt.split(default_sep)] 

그것을 사용하는 방법 :

>>> split('ABC ; DEF123,GHI_JKL ; MN OP', (',', ';')) 
['ABC', 'DEF123', 'GHI_JKL', 'MN OP'] 

성능 시험 :

import timeit 
import re 


TEST = 'ABC ; DEF123,GHI_JKL ; MN OP' 
SEPS = (',', ';') 


rsplit = re.compile("|".join(SEPS)).split 
print(timeit.timeit(lambda: [s.strip() for s in rsplit(TEST)])) 
# 1.6733491150007467 

print(timeit.timeit(lambda: split(TEST, SEPS))) 
# 1.6442800510003508 
+1

아주 좋습니다. 이것을 최고의 답으로 선택해야합니다. 모두에게 감사드립니다! – blah238

+0

SO가 공백을 압축하고 위의 문자열에 두 개 이상의 연속 공백이 있습니다. – fabrizioM

+0

고맙게도 항상 쉼표 또는 세미콜론 중 하나가 있습니다. – blah238

5

,

[s.strip() for s in re.split(",|;", string)] 

또는

[t.strip() for s in string.split(",") for t in s.split(";")] 

없이하려고합니다.

+0

대신에 문자열의'split()'을 통해 're'가져 오기를 피하십시오. 'ABC, DEF123, GHI_JKL, MN OP'.split (', |; ')' – marcog

+1

@macrog :이 문자열을 ', |; "'의 모든 축 어적으로 분리하지 않겠습니까? –

+0

위대한 작품! 고마워요 :) – blah238

0
>>> re.split('\s*,\s*|\s*;\s*', 'a , b; cdf') 
['a', 'b', 'cdf'] 
0

e 위의 대답을 테스트 케이스와 함께 사용하려면 정규식을 사용하고 은 하나 이상의 분리 문자를 사용합니다. 귀하의 경우 분리 문자는 ',', '|', ';' 및 공백. 파이썬의 공백은 '\ w', 그래서 이해입니다 : 내가 회신 할 수 없습니다

import re 
list = [s for s in re.split("[,|;\W]+", string)] 

는의 위 답변 스벤,하지만 난 괄호 안의 문자 중 하나 이상에 분할하고, 사용할 필요가 없습니다 strip() 메서드.

Yikes, 질문을 올바르게 읽지 못했습니다 ... Sven의 답변은 작동합니다. 광산은 공백이 또 다른 분리라고 가정합니다.