2011-01-03 3 views
22

파이썬에는 목록이 아닌 반복자를 생성하는 문자열에서 분할을 수행하는 빌드 인 (표준 라이브러리에서의 의미)이 있습니까? 나는 매우 긴 문자열을 작업하고 문자열의 대부분을 사용할 필요가 없다는 것을 명심해야한다.문자열을 반복자로 나누기

+2

"대부분의 문자열을 소비 할 필요가 없습니다"? 이것은 무엇을 의미 하는가? 문자열 객체는 모두 메모리에 있습니다. 모든 것이 메모리에 있고 이미 시퀀스이므로 문자를 반복 할 필요가 없습니다. "대부분의 문자열을 소비 할 필요가 없다"는 의미를 정의 해 주시겠습니까? –

+0

예, 문자열이 이미 메모리에 있습니다. 그러나 분할 할 위치를 결정하거나 분할로 인해 부분 문자열을 만들 때 문자열 전체를 탐색 할 필요가 없습니다. –

+1

아마 당신은 iterator를 제공하는 어떤 종류의 tokeniser 또는 스캐너가 필요합니다. 아래의 정규 표현식 솔루션의 대답이 효과가 있습니다. –

답변

15

문자열을 직접 분리하지 않지만 re 모듈은 re.finditer() (및 컴파일 된 일반 표현식에 해당하는 finditer() 메서드)을가집니다.

는 @Zero는 예를 들어 질문 :

>>> import re 
>>> s = "The quick brown\nfox" 
>>> for m in re.finditer('\S+', s): 
...  print(m.span(), m.group(0)) 
... 
(0, 3) The 
(4, 9) quick 
(13, 18) brown 
(19, 22) fox 
+2

're.finditer()'를 사용하여 분할 문자열을 반복하는 방법의 예가 도움이 될 것입니다. – Zero

+1

@Zero, 정확하게 어렵지는 않지만 여기에 있습니다. – Duncan

5

S. 로트처럼, 나는 아주 당신이 원하는 것을 모른다. 다음은 도움이 될 수있는 코드입니다.

s = "This is a string." 
for character in s: 
    print character 
for word in s.split(' '): 
    print word 

다음 문자를 찾기위한 s.index() 및 s.find()도 있습니다.


나중에 : 좋아요.

>>> def tokenizer(s, c): 
...  i = 0 
...  while True: 
...   try: 
...    j = s.index(c, i) 
...   except ValueError: 
...    yield s[i:] 
...    return 
...   yield s[i:j] 
...   i = j + 1 
... 
>>> for w in tokenizer(s, ' '): 
...  print w 
... 
This 
is 
a 
string. 
+1

주석의 설명을 참조하십시오. 이것은 질문에 대답하지 않습니다. – marcog

+0

그는 * 내장 * –

+3

@ 7vies를 명시 적으로 요구하고 있습니다. "아니요"라고 말하거나 "정규 표현식 사용 (위의 대답)"이라고 말하는 것이 낫다고 생각했습니다. – hughdbrown

0

당신은 (파이썬 유통 자체에 흡수 된,하지만 표준 라이브러리에서 가져올 수 없습니다) SPARK 같은 것을 사용할 수 있지만 Duncan's answer 아마도 단지뿐만 아니라 서비스를 제공 할 수 있도록 궁극적으로뿐만 아니라 정규 표현식을 사용하여 공백으로 분할하는 것만 큼 쉽습니다.

훨씬 더 힘든 옵션은 속도를 정말로 원한다면 자신의 파이썬 모듈을 C 언어로 작성하는 것이지만 훨씬 많은 시간 투자가 필요합니다.

3

전체 문자열을 소비 할 필요가 없다면 특정 항목을 찾고 있기 때문입니다. 맞습니까? 그런 다음 분할하는 대신 re 또는 .find()으로 찾으십시오. 그렇게하면 문자열에 관심이있는 부분을 찾아서 분리 할 수 ​​있습니다.

+0

내가 마음에 가지고있는 응용 프로그램에서, 나는 무엇이 었는지에 따라 세 번째 하위 문자열을 확인하고 네 번째 또는 여섯 번째 하위 문자열을 확인한 다음 나머지 문자열을 처리하려고했습니다. –

+2

@ pythonic metaphor : 예, 해당 문자열이 * 정말 * 길면're' 또는'find'를 사용하는 것이 좋습니다. 다른 경우에는 공백으로 나누십시오. 나도 몰라,하지만 나에게는 조숙 한 최적화일지도 모른다는 질문이 들린다. ;) 그래서 당신은 반드시 그것을 프로파일 링해야합니다. –

+3

@ pythonic metaphor : 조기에 최적화 된 일반 텍스트의 경우. 텍스트가 "큰"어딘가에서 >> 10MB가되기 시작합니다. 설명 된 응용 프로그램에 대해서는'text.split (None, 6)'을 사용하여 처음 6 단어를 얻습니다. 어쨌든 전체 텍스트를 분할해야하는 경우 즉시 수행하십시오. –

0

보기 itertools. 여기에는 takewhile, islicegroupby과 같은 내용이 포함되어 있습니다. 이터베이스는 인덱스 또는 정렬의 부울 조건에 따라 반복 가능한 다른 반복 가능 요소로 슬라이스 할 수 있습니다.

0

str.split의 내장 이터레이터 기반 아날로그가 없습니다.

iterator = iter("abcdcba".split("b")) 
iterator 
# <list_iterator at 0x49159b0> 
next(iterator) 
# 'a' 

그러나이 타사 라이브러리에서 도구 가능성이 more_itertools.split_at, 당신이 원하는 것을 제공 : 당신의 필요에 따라 당신은리스트 반복자를 만들 수 있습니다. 예를 들어 this post을 참조하십시오.