2012-01-19 3 views
26

파이썬에서 공백으로 문자열을 분할하려면 모든 공백 문자에 의해 분할 문자열, 하나는 일반적으로 매개 변수없이 문자열의 split 방법을 사용파이썬 :

>>> 'a\tb c\nd'.split() 
['a', 'b', 'c', 'd'] 

그러나 어제 나는대로 단어 사이에 ZERO WIDTH SPACE을 사용하는 문자열을 가로 질러 잘. (자바 스크립트 사람들 사이에서) 짧은 black magic 성능에 내 새로운 지식을 설정하는 데, 나는 split이 충분하지 않기 때문에, 모든 whitespace characters에 의해 더 나은 분할하는 방법을 부탁드립니다 :

>>> u'a\u200bc d'.split() 
[u'a\u200bc', u'd'] 

UPD1

sth에 의해 제안 된 솔루션은 일반 적으로 작동하지만 일부 OS 설정 또는 Python 컴파일 옵션에 의존합니다. 확실한 이유를 알고 있으면 좋을 것입니다 (Windows에서 설정을 전환 할 수있는 경우).

그래서 나는이 문제에 대해 유니 코드 기술위원회에 연락하고 신속하게 다시 응답을 받았습니다받은 : UPD2 cptphil

분명 모든 것을 만드는 큰 link을 발견했다.

가 ZS에서 U + 200B 제로 폭 공간을 변경 : 그들은 ZWSP 공백으로 간주 한 번에 한 번했지만 그 unicode site에서 유니 코드 4.0.1

인용문에서 변경되었음을 지적 Cf (2003.10.27)

U + 200B Zero Width Space (ZWSP) 사용에 대한 지속적인 문제가있었습니다. 이 문자의 기능은 일반적으로 허용되지 않는 위치에서 줄 바꿈을 허용하는 것이므로 기능적으로 일반 범주가 Cf 인 형식 문자입니다. 이 동작은 유니 코드 표준에 잘 설명되어 있으며 문자는 유니 코드 문자 데이터베이스에서 공백 문자로 간주되지 않습니다. 그러나 역사적인 이유로 일반 카테고리는 여전히 Zs (Space Separator)이며, 문자가 오용 될 수 있습니다. ZWSP는 공백이 아닌 유일한 Z 문자이기도합니다. 일반 카테고리는 규칙의 오역을 야기 할 수 있습니다. D13 기본 문자는 ZWSP가 마크 결합의 기준으로 허용하는 것으로 간주합니다.

U + 200B의 일반 카테고리를 Zs에서 Cf로 변경하는 것이 좋습니다.

해상도 : 종료. U + 200B의 일반 범주는 유니 코드 버전 4.0.1에서 Zs에서 Cf로 변경됩니다.

그런 다음 변경 사항이 Python에 반영되었습니다. Python 2.5.4와 2.6.5에서 u'\u200B'.isspace()의 결과는 True이고, Python 2.7.1에서는 이미 False입니다.

>>> u'a\u200Ac'.split() 
[u'a', u'c'] 

그리고 당신을 위해 충분하지 않은 경우 아래에 제시 한 Gabi Purcaru로에 의해 문자 하나를 추가 split 일반 다른 공백 문자가 들어

은 충분하다.

+1

'u'a \ u200bc 디부 .split()'리턴'[u'a ', u'c'를 u'd ' ]'. 이것은 우분투에서 파이썬 2.6.5를 사용하고 있습니다. – NPE

+1

@aix : 여기에'[u'a \ u200bc, u'd ']'(아치 리눅스의 Python 2.7.2)를 반환합니다. 미국 로케일. –

+0

@aix, hmm, interesting! – newtover

답변

17

편집

기술적으로 공백으로 정의되지 않았으므로 파이썬은 unicode 플래그가 켜져 있어도 \ s와 일치하는 것으로 인식하지 못합니다. 따라서 공백이 아닌 문자로 처리해야합니다.

http://en.wikipedia.org/wiki/Whitespace_character#Unicode

http://bugs.python.org/issue13391

import re 

re.split(ur"[\u200b\s]+", "some string", flags=re.UNICODE) 
+0

링크 덕분에 – newtover

+0

여기에 '\ s'가 문서화되어 있습니다. https://docs.python.org/2/howto/regex.html –

2

사용자는 '분할'에 세퍼레이터를 버리는 "모듈을 사용하여 전달할 수 http://docs.python.org/library/re.html#re.split

+0

그런 식으로 하나의 구분 기호를 전달할 수 있습니다. 그들 중 하나의 그룹이 아니다. – newtover

+0

이것은 가능한 모든 공백 문자 목록이 아닌 * 하나 * 구분 기호 문자열 만 지정할 수 있으므로 OP에 도움이되지 않습니다. 'split()'과'sep' 인자는 인자가없는 것과는 전혀 다른 방식으로 동작합니다. 자세한 내용은 링크를보십시오. –

+0

죄송합니다. 'str'문서 링크를 're'대신 붙여 넣으 셨습니다 - 고정;) –

6

가 활성화 유니 코드와 일치하는 정규 표현을 사용할 수

>>> re.split(r'(?u)\s', u'a\u200bc d') 
[u'a', u'c', u'd'] 
+1

당신 (그리고 @aix)에는 내가 가지고 있지 않은 설정이 있습니다! Windows 7에서는 작동하지 않습니다. – newtover

+0

인근의 FreeBSD에서도 작동합니다! – newtover

4

이 원하는, re.split를 사용 이 :

import re 
re.split(u'\s|\u200b', your_string) 
+0

나는 그 (것)들을 모두 = ( – newtover

+0

잘가는 가장 좋은 방법은 @ sth의 이름이지만, 만약 당신을 위해 작동하지 않는다면, 당신은 그들 모두를 이름을 지어야 할 수도 있습니다. 왜 그들의 솔루션이 작동하지 않는지) –

2

당신이 뭔가를 사용할 수 있습니까?

re.split(r'\s+', your_string, re.UNICODE) 
2

그냥 사용 split : 내 컴퓨터에

>>> u'\u200b'.isspace() 
True 
+0

항상 작동하지는 않는 질문의 텍스트 – newtover

+0

+1은'isspace' 메소드에 대해 알고 있습니다. =) – newtover