2009-08-08 2 views
4

여러 줄 문자열을 반복되는 공백없이 한 줄짜리 문자열로 접을 수있는 교차 플랫폼 라이브러리 함수가 있습니까?파이썬에서 문자열 붕괴 라이브러리 함수가 있습니까?

저는 아래에 몇 가지 팁을 제안했지만, C에서 최적화 된 표준 함수가 있는지 궁금합니다.

def collapse(input): 
    import re 
    rn = re.compile(r'(\r\n)+') 
    r = re.compile(r'\r+') 
    n = re.compile(r'\n+') 
    s = re.compile(r'\ +') 
    return s.sub(' ',n.sub(' ',r.sub(' ',rn.sub(' ',input)))) 

P. 좋은 관찰에 감사드립니다. ' '.join(input.split())이 승자가되는 것 같습니다. 실제로는 실제로 제 2의 경우 약 2 배 빠르게 실행됩니다. 사전에 컴파일 된 r'\s+' 정규식으로 검색을 대체하는 것과 비교됩니다.

+1

질문 제목에 "크로스 플랫폼"이있는 이유는 무엇입니까? 파이썬의 거의 모든 것들은 OS에 특정한 것들을 제외하고는 크로스 플랫폼이다. 이것은 명확하게 OS에 한정되지 않습니다. –

+0

좋은 지적. 나는 '\ n'문자가 파이썬에서 크로스 플랫폼이라는 것을 몰랐다. 나는 '\ n'이 말 그대로 특별한 ascii char를 의미한다고 생각했다. – Evgeny

+0

그것은 문자 그대로 특별한 ascii char를 의미합니다. 그 문자는 모든 플랫폼에서 동일합니다 - 개행 문자. –

답변

12

내장 string.split() 방법 당신이를 사용하여 다음과 같은 공간을 사용하여 결과 목록에 가입 할 수 있도록 공백의 실행에 분할합니다 :

:

' '.join(my_string.split()) 

여기에 완전한 테스트 스크립트의를

TEST = """This 
is  a test\twith a 
    mix of\ttabs,  newlines and repeating 
whitespace""" 

print ' '.join(TEST.split()) 
# Prints: 
# This is a test with a mix of tabs, newlines and repeating whitespace 
0
multi_line.replace('\n', '') 

이 작업을 수행합니다. '\n'은 파이썬에서 보편적 인 줄 끝 문자입니다.

+1

. 알아 둘만한. 빈 공간을 삽입하지 않고 반복되는 빈 공간을 제거하지 않기 때문에 잘 작동하지 않을 것입니다. – Evgeny

+0

@Evgeny가 "빈 공간"으로 무엇을 의미하는지는 모르지만 어쨌든 제안 된 해결책은 OP의 "반복되는 공간 없음"요구 사항. –

4

당신이 올바른 생각을했다, 당신은 좀 더 밀접하게 파이썬 설명서를 읽는 데 필요한 :

import re 
somewhitespace = re.compile(r'\s+') 
TEST = """This 
is  a test\twith a 
    mix of\ttabs,  newlines and repeating 
whitespace""" 

somewhitespace.sub(' ', TEST) 

'This is a test with a mix of tabs, newlines and repeating whitespace' 
관련 문제