2014-12-10 3 views
1

아래의 문자열 a를리스트로 분할하는 정규식을 찾으려고합니다. 문자열을 분리하는 확실한 방법을 아직 찾지 못했지만 요청한 주된 이유는 왜 마지막 문자열이 복제되는지 이해할 수 없다는 것입니다. regex101.com에서 온라인으로 테스트 할 때 발생하지 않습니다. 내 이해를 위해 re.split 함수로 인해 데이터를 복제 할 이유가 없어야합니다.파이썬 다시 모듈에서 이상한 동작

코드는 :

import re 
a = ['"This is a string", "and this is another with a , in it", Thisisalsovalid, "",,,"And a string"'] 
b = re.split(r',(?=(".*?"|[\w/-]*|,))', a[0]) 
for i in b: 
    print(i) 

출력 :

"This is a string" 

"and this is another with a 

in it" 

Thisisalsovalid 

"" 




"And a string" 
"And a string" 

예상 출력된다 :

"This is a string" 
"and this is another with a , in it" 
Thisisalsovalid 
"" 


"And a string" 

목록 헤더리스트없이 함께 압축 될 색인 문제.

보너스로 문자열에 나타날 때를 제외하고 나는 기꺼이 ','로 나뉘는 정규식을 얻습니다.

+0

(https://regex101.com/r/zR7uR1/1) . 쉼표와 일치하며 짝수 개의 따옴표가옵니다. –

+0

하나의 간단한 대답은 (?!)이지만 실제 데이터의 공간에 대한 보장이 없으므로 오류가 발생하기 쉽습니다. 그리고 여전히, 복제의 이유는 내가 가장 수수께끼 인 것입니다. – Bengt62

+1

이것은 중복이 아닙니다 .OP는 재 반발의 이유를 알고 싶어합니다. 재개를위한 지명. – vks

답변

0
,(?=(?:[^"]*""?[^"]*")*[^"]*$) 

보십시오. 데모를보십시오.

https://regex101.com/r/nL5yL3/36

너의 당신은뿐만 아니라 그룹화 때문에

b = re.split(r',(?=(?:".*?"|[\w/-]*|,))', a[0]) 

        ^^ 

사용 this.Duplicates이 나타나는 경우 작업 할 수 있습니다. split도 그룹화 된 요소를 반환합니다. 따라서 캡처하지 않습니다.

0

왜 csv 형식의 문자열을 읽을 때 기존 솔루션을 사용하지 않습니까?

import csv 
import StringIO 
s = ['"This is a string", "and this is another with a , in it", Thisisalsovalid, "",,,"And a string"'] 
reader = csv.reader(StringIO.StringIO(s[0]), skipinitialspace=True) 
for row in reader: 
    for value in row: 
     print value 

출력 : 마지막 경기가 중복되는 이유는 모르겠지만, 나는 [패턴] 기여할 수

This is a string 
and this is another with a , in it 
Thisisalsovalid 



And a string 
+0

출력이 예상대로 작동하지 않습니까? – Kent

+0

이것이 작동하는 솔루션이지만, t는 주 질문에 답하기 때문에 대신 @vks 대답을 수락하지만 이것은 나에게 새로운 통찰력도주었습니다. – Bengt62

+0

정규 표현식으로 고생하고 여기서 끝내는 사람들을 위해서입니다. 기존 솔루션을 사용해야합니다. –