문자열에서 모든 공백을 제거하는 방법


179

파이썬 문자열의 모든 공백을 어떻게 제거합니까? 예를 들어, 문자열 strip my spaces을로 바꾸고 stripmyspaces싶지만 strip()다음 과 같이 달성 할 수는 없습니다 .

>>> 'strip my spaces'.strip()
'strip my spaces'

13
str.strip은 앞뒤 공백에만 영향을 미칩니다.

답변:


311

sep 매개 변수없이 str.split의 동작 활용 :

>>> s = " \t foo \n bar "
>>> "".join(s.split())
'foobar'

모든 공백 대신 공백을 제거하려는 경우 :

>>> s.replace(" ", "")
'\tfoo\nbar'

조기 최적화

명확한 코드를 작성하는 것이 효율성이 주요 목표는 아니지만 초기 타이밍은 다음과 같습니다.

$ python -m timeit '"".join(" \t foo \n bar ".split())'
1000000 loops, best of 3: 1.38 usec per loop
$ python -m timeit -s 'import re' 're.sub(r"\s+", "", " \t foo \n bar ")'
100000 loops, best of 3: 15.6 usec per loop

정규식이 캐시되어 있으므로 예상보다 느리지 않습니다. 미리 컴파일하면 도움이 될 수 있지만 여러 번 호출하면 실제로 중요합니다 .

$ python -m timeit -s 'import re; e = re.compile(r"\s+")' 'e.sub("", " \t foo \n bar ")'
100000 loops, best of 3: 7.76 usec per loop

re.sub의 속도는 11.3 배 더 느리지 만 병목 현상은 다른 곳에서도 확실하게 기억하십시오. 대부분의 프로그램은이 3 가지 선택의 차이점을 인식하지 못합니다.


\s+대체 보다 느릴 것 입니다. 나는 다시 붙어 있습니다.
OTZ

@OTZ : 놀랄지도 모르지만 "기억하십시오"메모를보십시오.

@ 로거 흠. 흥미 롭군 우연히이 s.translate방법 을 사용해 보셨습니까 ? 아마도이 페이지에 표시된 모든 방법을 능가 할 것입니다.
OTZ

@Roger Pate : 번역에 '테이블'인수가 필요 None하지는 않지만 놀랍게도 속도가 느려질 수 있습니다.
martineau

1
시도하십시오 myString.translate(None, " \t\r\n\v"). Roger의 가장 빠른 (분할 및 조인) 기술에 비해 83 % 만 소요됩니다. 분할되는 모든 공백 문자를 포함하는지 확실하지 않지만 대부분의 ASCII 응용 프로그램에는 충분합니다.
brianmearns

60
>>> import re
>>> re.sub(r'\s+', '', 'strip my spaces')
'stripmyspaces'

또한 당신이 생각하지 않는 공백 문자를 처리합니다 (믿습니다. 많이 있습니다).


3
이것은 대답보다 훨씬 덜 해킹 된 솔루션입니다.
John Smith

이것은 다른 답변보다 더 분명하므로 케이크가 필요합니다.
Tristan

34

또는

"strip my spaces".translate( None, string.whitespace )

그리고 여기에 Python3 버전이 있습니다 :

"strip my spaces".translate(str.maketrans('', '', string.whitespace))

이것은 가장 파이썬적인 것 같습니다. 왜 정상에 오르지 않았습니까?
rbp

대답의 Python 3 코드가 작동합니다. @ DanMenes의 코멘트는 더 이상 사용되지 않습니다
igo

3
NameError: name 'string' is not defined.
Zelphir Kaltstahl

당신은 필요 @ZelphirKaltstahlimport string
Shahryar Saljoughi

13

가장 간단한 방법은 replace를 사용하는 것입니다.

"foo bar\t".replace(" ", "").replace("\t", "")

또는 정규식을 사용하십시오.

import re
re.sub(r"\s", "", "foo bar\t")

10

파이썬에서 시작 공간 제거

string1="    This is Test String to strip leading space"
print string1
print string1.lstrip()

파이썬에서 후행 또는 끝 공간 제거

string2="This is Test String to strip trailing space     "
print string2
print string2.rstrip()

파이썬에서 문자열의 시작과 끝에서 공백을 제거하십시오.

string3="    This is Test String to strip leading and trailing space      "
print string3
print string3.strip()

파이썬에서 모든 공백을 제거하십시오

string4="   This is Test String to test all the spaces        "
print string4
print string4.replace(" ", "")

3

로 정규식을 사용해보십시오 re.sub. 모든 공백을 검색하고 빈 문자열로 바꿀 수 있습니다.

\s패턴에서 공백 (탭, 줄 바꿈 등)뿐만 아니라 공백 문자와 일치합니다. 자세한 내용 은 설명서를 참조하십시오 .


나는 정규 표현식에 :( 사용하는 방법을 몰라
wrongusername

@wrongusername : re 모듈 매뉴얼 페이지에 대한 링크로 업데이트되었습니다.
Matthew Iselin

2
import re
re.sub(' ','','strip my spaces')

3
SO에 오신 것을 환영합니다. 답변 해 주셔서 감사하지만 다른 답변보다 추가 가치를 제공하는 것이 좋습니다. 이 경우 다른 사용자가 해당 솔루션을 이미 게시 했으므로 귀하의 답변은 추가 가치를 제공하지 않습니다. 이전 답변이 도움이 되었으면 평판이 충분 해지면 투표해야합니다.
Maximilian Peters

"모든 공백을 제거하는 방법"이라는 질문에는 대답하지 않습니다. 공백 만 제거
Nick

2

Roger Pate가 언급했듯이 다음 코드가 나를 위해 일했습니다.

s = " \t foo \n bar "
"".join(s.split())
'foobar'

Jupyter Notebook을 사용하여 다음 코드를 실행하고 있습니다.

i=0
ProductList=[]
while i < len(new_list): 
   temp=''                            # new_list[i]=temp=' Plain   Utthapam  '
   #temp=new_list[i].strip()          #if we want o/p as: 'Plain Utthapam'
   temp="".join(new_list[i].split())  #o/p: 'PlainUtthapam' 
   temp=temp.upper()                  #o/p:'PLAINUTTHAPAM' 
   ProductList.append(temp)
   i=i+2

2

목록을 필터링하는 표준 기술은 split/join또는 translate방법 만큼 효율적이지 않지만 적용됩니다 .

공백 세트가 필요합니다 :

>>> import string
>>> ws = set(string.whitespace)

filter내장 :

>>> "".join(filter(lambda c: c not in ws, "strip my spaces"))
'stripmyspaces'

목록 이해 (예, 괄호 사용 : 아래 벤치 마크 참조) :

>>> import string
>>> "".join([c for c in "strip my spaces" if c not in ws])
'stripmyspaces'

배 :

>>> import functools
>>> "".join(functools.reduce(lambda acc, c: acc if c in ws else acc+c, "strip my spaces"))
'stripmyspaces'

기준:

>>> from timeit import timeit
>>> timeit('"".join("strip my spaces".split())')
0.17734256500003198
>>> timeit('"strip my spaces".translate(ws_dict)', 'import string; ws_dict = {ord(ws):None for ws in string.whitespace}')
0.457635745999994
>>> timeit('re.sub(r"\s+", "", "strip my spaces")', 'import re')
1.017787621000025

>>> SETUP = 'import string, operator, functools, itertools; ws = set(string.whitespace)'
>>> timeit('"".join([c for c in "strip my spaces" if c not in ws])', SETUP)
0.6484303600000203
>>> timeit('"".join(c for c in "strip my spaces" if c not in ws)', SETUP)
0.950212219999969
>>> timeit('"".join(filter(lambda c: c not in ws, "strip my spaces"))', SETUP)
1.3164566040000523
>>> timeit('"".join(functools.reduce(lambda acc, c: acc if c in ws else acc+c, "strip my spaces"))', SETUP)
1.6947649049999995

0

TL / DR

이 솔루션은 Python 3.6을 사용하여 테스트되었습니다.

Python3의 문자열에서 모든 공백을 제거하려면 다음 함수를 사용할 수 있습니다.

def remove_spaces(in_string: str):
    return in_string.translate(str.maketrans({' ': ''})

공백 문자 ( '\ t \ n \ r \ x0b \ x0c')를 제거하려면 다음 기능을 사용할 수 있습니다.

import string
def remove_whitespace(in_string: str):
    return in_string.translate(str.maketrans(dict.fromkeys(string.whitespace)))

설명

파이썬의 str.translate메소드는 str의 내장 클래스 메소드이며, 테이블을 가져와 전달 된 변환 표를 통해 각 문자가 맵핑 된 문자열의 사본을 리턴합니다.str.translate에 대한 전체 문서

번역 테이블을 만드는 str.maketrans데 사용됩니다. 이 메소드는의 또 다른 내장 클래스 메소드입니다 str. 여기서는 하나의 매개 변수 (이 경우 사전)와 함께 사용합니다. 여기서 키는 대체 될 문자와 문자 대체 값으로 매핑됩니다. 와 함께 사용할 변환 표를 반환합니다 str.translate. str.maketrans에 대한 전체 문서

string파이썬 의 모듈에는 일반적인 문자열 연산과 상수가 포함되어 있습니다. string.whitespace공백으로 간주되는 모든 ASCII 문자가 포함 된 문자열을 반환하는 상수입니다. 여기에는 문자 공간, 탭, 줄 바꿈, 반환, 용지 공급 및 세로 탭이 포함됩니다.문자열에 대한 전체 설명서

두 번째 함수 dict.fromkeys에서는 키가 string.whitespacevalue 가있는 문자열로 반환되는 문자 인 사전을 만드는 데 사용됩니다 None. dict.fromkeys에 대한 전체 문서


0

최적의 성능이 요구되지 않고 단순히 단순한 것을 원한다면 문자열 클래스의 내장 "isspace"메소드를 사용하여 각 문자를 테스트하는 기본 함수를 정의 할 수 있습니다.

def remove_space(input_string):
    no_white_space = ''
    for c in input_string:
        if not c.isspace():
            no_white_space += c
    return no_white_space

건물 no_white_space문자열은이 방법으로 이상적인 성능을 가지고 있지만,이 솔루션은 이해하기 쉬운되지 않습니다.

>>> remove_space('strip my spaces')
'stripmyspaces'

함수를 정의하지 않으려는 경우이를 목록 이해와 모호한 것으로 변환 할 수 있습니다. 최고 답변의 join솔루션 에서 차용 :

>>> "".join([c for c in "strip my spaces" if not c.isspace()])
'stripmyspaces'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.