쉼표로 분할되지만 공백을 제거하지 않는 파이썬 코드가 있습니다.
>>> string = "blah, lots , of , spaces, here "
>>> mylist = string.split(',')
>>> print mylist
['blah', ' lots ', ' of ', ' spaces', ' here ']
오히려 다음과 같이 공백이 제거됩니다.
['blah', 'lots', 'of', 'spaces', 'here']
나는 목록을 반복하고 각 항목을 strip () 할 수 있다는 것을 알고 있지만 이것이 파이썬이기 때문에 더 빠르고 쉽고 우아한 방법이 있다고 생각합니다.
답변
리스트 이해를 사용하십시오- for
루프 처럼 간단하고 읽기 쉽습니다 .
my_string = "blah, lots , of , spaces, here "
result = [x.strip() for x in my_string.split(',')]
# result is ["blah", "lots", "of", "spaces", "here"]
답변
정규식을 사용하여 분할하십시오. 참고 나는 공백을 사용하여 사례를보다 일반적으로 만들었습니다. 목록 이해는 앞면과 뒷면의 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에서 동일합니다.
답변
나는 추가했다 :
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
답변
분리하기 전에 문자열에서 공백을 제거하십시오.
mylist = my_string.replace(' ','').split(',')
답변
나는 이것이 이미 대답되었다는 것을 알고 있지만, 이것을 많이 끝내면 정규 표현식이 더 나은 방법 일 수 있습니다.
>>> import re
>>> re.sub(r'\s', '', string).split(',')
['blah', 'lots', 'of', 'spaces', 'here']
는 \s
공백 문자와 일치, 우리는 빈 문자열로 대체합니다 ''
. 자세한 정보는 여기에서 찾을 수 있습니다 : http://docs.python.org/library/re.html#re.sub
답변
import re
result=[x for x in re.split(',| ',your_string) if x!='']
이것은 나를 위해 잘 작동합니다.
답변
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']
짜잔!