파이썬에서 쉼표로 나누고 공백을 제거하십시오.


346

쉼표로 분할되지만 공백을 제거하지 않는 파이썬 코드가 있습니다.

>>> string = "blah, lots  ,  of ,  spaces, here "
>>> mylist = string.split(',')
>>> print mylist
['blah', ' lots  ', '  of ', '  spaces', ' here ']

오히려 다음과 같이 공백이 제거됩니다.

['blah', 'lots', 'of', 'spaces', 'here']

나는 목록을 반복하고 각 항목을 strip () 할 수 있다는 것을 알고 있지만 이것이 파이썬이기 때문에 더 빠르고 쉽고 우아한 방법이 있다고 생각합니다.

답변:


595

리스트 이해를 사용하십시오- for루프 처럼 간단하고 읽기 쉽습니다 .

my_string = "blah, lots  ,  of ,  spaces, here "
result = [x.strip() for x in my_string.split(',')]
# result is ["blah", "lots", "of", "spaces", "here"]

참조 : 리스트 이해에 관한 파이썬 문서리스트 이해에
대한 2 초간 설명.


1
대단히 좋은! 빈 목록 항목을 제거하기 위해 다음과 같이 하나의 항목을 추가했습니다. > text = [x! = ''] 인 경우 text.split ( '.')에서 x에 대한 x.strip ()
RandallShanePhD

@Sean : 유효하지 않은 / 불완전한 파이썬 코드가 "원래 게시물의 의도"입니까? 리뷰 wankers에 따르면 stackoverflow.com/review/suggested-edits/21504253 입니다. 그들이 틀렸다면 (다시) 수정하여 다른 방법으로 말할 수 있습니까?
Forage

원본은 REPL에서 복사하여 붙여 넣기하고 (정확하게 기억한다면) 목표는 기본 개념을 이해하는 것입니다 (목록 이해를 사용하여 작업 수행)-맞습니다. 목록 이해 를 보는 것이 더 합리적입니다. 새로운 목록을 생성합니다.
Sean Vieira

24

정규식을 사용하여 분할하십시오. 참고 나는 공백을 사용하여 사례를보다 일반적으로 만들었습니다. 목록 이해는 앞면과 뒷면의 null 문자열을 제거하는 것입니다.

>>> import re
>>> string = "  blah, lots  ,  of ,  spaces, here "
>>> pattern = re.compile("^\s+|\s*,\s*|\s+$")
>>> print([x for x in pattern.split(string) if x])
['blah', 'lots', 'of', 'spaces', 'here']

^\s+일치하지 않는 경우에도 작동합니다 .

>>> string = "foo,   bar  "
>>> print([x for x in pattern.split(string) if x])
['foo', 'bar']
>>>

^ \ s +가 필요한 이유는 다음과 같습니다.

>>> pattern = re.compile("\s*,\s*|\s+$")
>>> print([x for x in pattern.split(string) if x])
['  blah', 'lots', 'of', 'spaces', 'here']

blah의 앞 공간을 보십니까?

설명 : 위의 Python 3 인터프리터를 사용하지만 결과는 Python 2에서 동일합니다.


8
나는 [x.strip() for x in my_string.split(',')]묻는 질문에 대해 더 파이썬 적이 라고 생각 합니다. 아마도 내 솔루션이 필요한 경우가 있습니다. 하나 이상의 컨텐츠를 실행하면이 컨텐츠를 업데이트하겠습니다.
tbc0

^\s+필요한가요? 코드가 없으면 코드를 테스트했지만 작동하지 않지만 이유를 모르겠습니다.
laike9m

내가 사용 re.compile("^\s*,\s*$")하면 결과는 [' blah, lots , of , spaces, here ']입니다.
laike9m

@ laike9m, 나는 당신에게 차이점을 보여주기 위해 대답을 업데이트했습니다. ^\s+만든다. 직접 볼 수 있듯이 ^\s*,\s*$원하는 결과도 반환하지 않습니다. 따라서 정규 표현식으로 분할하려면을 사용하십시오 ^\s+|\s*,\s*|\s+$.
tbc0

선행 패턴 (^ \ s +)이 일치하지 않으면 첫 번째 일치 항목이 비어 있으므로 문자열 "foo, bar"에 대해 [ '', 'foo', 'bar']와 같은 것을 얻을 수 있습니다.
Steeve McCauley

21

나는 추가했다 :

map(str.strip, string.split(','))

하지만 이미 제이슨 Orendorff 언급했다 보았다 코멘트 .

동일한 답변에서 글렌 메이 너드의 의견을 읽고지도를 통해 목록 이해를 제안하는 이유는 무엇인지 궁금해하기 시작했습니다. 나는 그가 성능상의 이유를 의미한다고 생각했지만, 물론 그는 스타일적인 이유나 다른 것 (Glenn?)을 의미했을 수도 있습니다.

그래서 루프에서 세 가지 방법을 적용하여 상자에 대한 빠른 (아마도 결함이 있습니까?) 테스트가 나타났습니다.

[word.strip() for word in string.split(',')]
$ time ./list_comprehension.py 
real    0m22.876s

map(lambda s: s.strip(), string.split(','))
$ time ./map_with_lambda.py 
real    0m25.736s

map(str.strip, string.split(','))
$ time ./map_with_str.strip.py 
real    0m19.428s

map(str.strip, string.split(','))그들이 같은 야구장에있는 것처럼 보이지만 우승자를 만드는 것.

확실히 (맵이 있거나없는) 맵이 반드시 성능상의 이유로 배제되어서는 안되며, 적어도 목록 이해만큼 명확합니다.

편집하다:

우분투 10.04의 Python 2.6.5


15

분리하기 전에 문자열에서 공백을 제거하십시오.

mylist = my_string.replace(' ','').split(',')

10
쉼표로 구분 된 항목에 공백이 포함 된 경우 문제가 발생합니다 (예 :) "you just, broke this".
Robert Rossney

1
Geeze, -1입니다. 너희들은 힘들다. 그의 샘플 데이터는 단 하나의 단어 일 뿐이고 데이터가 문구 일 것이라는 사양은 없었다. 그러나 w / e, 그게 당신들이 어떻게 여기를 돌아 다니는 것 같아요.
user489041

어쨌든 고마워요. 공정하게하기 위해 특별히 split을 요청한 다음 strip () 및 strip은 선행 및 후행 공백을 제거하고 그 사이의 아무것도 만지지 않습니다. 그래도 약간의 변화와 대답은 완벽하게 작동합니다 .mylist = mystring.strip (). split ( ',') 비록 이것이 효율적인지 모르겠지만.
Mr_Chimp

12

나는 이것이 이미 대답되었다는 것을 알고 있지만, 이것을 많이 끝내면 정규 표현식이 더 나은 방법 일 수 있습니다.

>>> import re
>>> re.sub(r'\s', '', string).split(',')
['blah', 'lots', 'of', 'spaces', 'here']

\s공백 문자와 일치, 우리는 빈 문자열로 대체합니다 ''. 자세한 정보는 여기에서 찾을 수 있습니다 : http://docs.python.org/library/re.html#re.sub


3
공백이 포함 된 문자열에서는 예제가 작동하지 않습니다. "예를 들어,이 중 하나"는 "for", "examplethis", "one"이됩니다. 그것이 BAD 솔루션이라고 말하지 않고 (제 예제에서 완벽하게 작동합니다) 손에 든 작업에 달려 있습니다!
Mr_Chimp

네, 맞습니다! 공백이있는 문자열을 처리 할 수 ​​있도록 정규 표현식을 조정할 수는 있지만 목록 이해가 작동하면 스틱을 사용하십시오.)
Brad Montgomery

2
import re
result=[x for x in re.split(',| ',your_string) if x!='']

이것은 나를 위해 잘 작동합니다.


2

re (정규 표현식에서와 같이) 여러 문자를 한 번에 분할 할 수 있습니다.

$ string = "blah, lots  ,  of ,  spaces, here "
$ re.split(', ',string)
['blah', 'lots  ', ' of ', ' spaces', 'here ']

이것은 예제 문자열에서는 잘 작동하지 않지만 쉼표로 구분 된 목록에서는 훌륭하게 작동합니다. 문자열 예를 들어, re.split 전원을 결합하여 정규식 패턴 을 분할하여 "이것 또는 그에 대한 분할"효과를 얻을 수 있습니다.

$ re.split('[, ]',string)
['blah',
 '',
 'lots',
 '',
 '',
 '',
 '',
 'of',
 '',
 '',
 '',
 'spaces',
 '',
 'here',
 '']

불행히도, 그것은 추악하지만, filter의지는 트릭을 수행합니다.

$ filter(None, re.split('[, ]',string))
['blah', 'lots', 'of', 'spaces', 'here']

짜잔!


2
왜 안돼 re.split(' *, *', string)?
Paul Tomblin

4
@PaulTomblin 좋은 생각입니다. re.split('[, ]*',string)동일한 효과를 위해 이것을 할 수도 있습니다 .
Dannid

Dannid 필자는 @ tbc0의 대답과 같이 처음과 끝에서 공백을 제거하지 않는다는 것을 알게 된 후에 깨달았습니다.
Paul Tomblin

@PaulTomblinheh, 내 반박 [, ]*은 목록의 끝에 빈 문자열을 남깁니다. 필자는 필터가 여전히 좋은 방법이라고 생각하거나 최상위 답변처럼 목록 이해력을 고수합니다.
대니얼

1

map(lambda s: s.strip(), mylist)명시 적으로 반복하는 것보다 조금 낫습니다. 또는 한 번에 모든 것을 위해 :map(lambda s:s.strip(), string.split(','))


10
팁 : map, 특히 lambda사용하는 경우 목록 이해를 사용해야하는지 다시 확인하십시오.
Glenn Maynard,

11
로 람다를 피할 수 있습니다 map(str.strip, s.split(',')).
Jason Orendorff 2016


1
import re
mylist = [x for x in re.compile('\s*[,|\s+]\s*').split(string)]

간단히, 선행 / 성공 공백이 있거나없는 쉼표 또는 하나 이상의 공백.

시도하십시오!


0

map(lambda s: s.strip(), mylist)명시 적으로 반복하는 것보다 조금 낫습니다.
또는 한 번에 모든 것을 위해 :

map(lambda s:s.strip(), string.split(','))

기본적으로 필요한 모든 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.