2016-06-14 4 views
2

나는shlex : 파이썬에서 탈출 따옴표 3

['1', 'K\\^o, Suk\\'e'] 

shlex.split(line)로 파이썬 문자열

line = "1 'K\\^o, Suk\\'e'\n" 

로 인쇄

1 'K\^o, Suk\'e' 

하지 않는 아스키 텍스트를 분할 할 일하고, ValueError("No closing quotation")를주고.

>>> lexer = shlex.shlex(line) 
>>> lexer.wordchars += "\\'" 
>>> list(lexer) 
['1', "'K\\", '^', 'o', ',', "Suk\\'e'"] 

을하지만 다시는 내 의도되지 않습니다 :

나는 다음과 같이 wordchars에 추가했습니다.

>>> line2= "1 'K\\^o, Suk\\e'\n" 
>>> shlex.split(line2) 
['1', 'K\\^o, Suk\\e'] 

방법이 고정 될 수있다 : 인용없이

는 모든 것이 예상대로 작동?

편집 : 나는 왔어요 가장 가까운입니다 : 여전히 옳지 않다

>>> lexer = shlex.shlex(line) 
>>> lexer.wordchars += "\\'" 
>>> lexer.wordchars += " " 
>>> lexer.wordchars += "\\^" 
>>> lexer.wordchars += "," 
>>> list(lexer) 
['1', "'K\\^o,", "Suk\\'e'"] 

.

편집 : 예제 문자열은 다소 오해의 소지가 있습니다. 또한 분할 할 수 있어야

>>> l1 = "C12 H2 'Hello friend'" 

shlex 얻을 수 l1 문제 없음을 말한다.

+0

에 POSIX 모드와 escapedquotes를 사용할 수 있습니까? –

+0

@VasiliSyrakis : 두 번째 것은 작은 따옴표 안에 있기 때문에. – jwodder

+1

@Aquiles : 내 ascii 파일의 텍스트는'1 'K \^o, Suk \'e ''입니다. 'f.readlines()'를 사용하여이 파일을 불러 오면''1 'K \\^o, Suk \\'e '\ n "'로 출력됩니다. 바라기를 이것은 내 뜻을 분명히합니다. – user14717

답변

1

당신은 '" 대신 단지 "

>>> line = "1 'K\\^o, Suk\\'e'\n" 
>>> lexer = shlex.shlex(line, posix=True) 
>>> lexer.escapedquotes = "'\"" 
>>> list(lexer) 
['1', "K\\^o, Suk'e"] 
0

분할에 정규식을 사용하는 것이 더 간단 할 수 있습니다. 이 공백은 공백 문자보다 먼저 오는 첫 번째 토큰으로 나뉘며 그 다음 나머지 문자열이 나옵니다. 이 두 번째를 첫 번째 공간 분할하지만,하지 않을 이유

re.match('(\S+)\s+(.*)', line).groups() 
+0

아니, 내가 생각하기에 그것은 ascii이다. 나는 여전히 당신의 접근법을 사용할 수있다. ... – user14717

+0

더 일반적인 토큰 분할에 대한 편집 된 대답을 보시오. – Riaz

+0

이것은 매우 훌륭한 정규 표현식이다. ,'line = "C1 C2 C3"'에서는 실패하는데,'shlex.split'은 제대로 처리한다. – user14717

관련 문제