파이썬에는 목록이 아닌 반복자를 생성하는 문자열에서 분할을 수행하는 빌드 인 (표준 라이브러리에서의 의미)이 있습니까? 나는 매우 긴 문자열을 작업하고 문자열의 대부분을 사용할 필요가 없다는 것을 명심해야한다.문자열을 반복자로 나누기
답변
문자열을 직접 분리하지 않지만 re
모듈은 re.finditer()
(및 컴파일 된 일반 표현식에 해당하는 finditer()
메서드)을가집니다.
>>> 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
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.
주석의 설명을 참조하십시오. 이것은 질문에 대답하지 않습니다. – marcog
그는 * 내장 * –
@ 7vies를 명시 적으로 요구하고 있습니다. "아니요"라고 말하거나 "정규 표현식 사용 (위의 대답)"이라고 말하는 것이 낫다고 생각했습니다. – hughdbrown
당신은 (파이썬 유통 자체에 흡수 된,하지만 표준 라이브러리에서 가져올 수 없습니다) SPARK 같은 것을 사용할 수 있지만 Duncan's answer 아마도 단지뿐만 아니라 서비스를 제공 할 수 있도록 궁극적으로뿐만 아니라 정규 표현식을 사용하여 공백으로 분할하는 것만 큼 쉽습니다.
훨씬 더 힘든 옵션은 속도를 정말로 원한다면 자신의 파이썬 모듈을 C 언어로 작성하는 것이지만 훨씬 많은 시간 투자가 필요합니다.
전체 문자열을 소비 할 필요가 없다면 특정 항목을 찾고 있기 때문입니다. 맞습니까? 그런 다음 분할하는 대신 re
또는 .find()
으로 찾으십시오. 그렇게하면 문자열에 관심이있는 부분을 찾아서 분리 할 수 있습니다.
내가 마음에 가지고있는 응용 프로그램에서, 나는 무엇이 었는지에 따라 세 번째 하위 문자열을 확인하고 네 번째 또는 여섯 번째 하위 문자열을 확인한 다음 나머지 문자열을 처리하려고했습니다. –
@ pythonic metaphor : 예, 해당 문자열이 * 정말 * 길면're' 또는'find'를 사용하는 것이 좋습니다. 다른 경우에는 공백으로 나누십시오. 나도 몰라,하지만 나에게는 조숙 한 최적화일지도 모른다는 질문이 들린다. ;) 그래서 당신은 반드시 그것을 프로파일 링해야합니다. –
@ pythonic metaphor : 조기에 최적화 된 일반 텍스트의 경우. 텍스트가 "큰"어딘가에서 >> 10MB가되기 시작합니다. 설명 된 응용 프로그램에 대해서는'text.split (None, 6)'을 사용하여 처음 6 단어를 얻습니다. 어쨌든 전체 텍스트를 분할해야하는 경우 즉시 수행하십시오. –
보기 itertools
. 여기에는 takewhile
, islice
및 groupby
과 같은 내용이 포함되어 있습니다. 이터베이스는 인덱스 또는 정렬의 부울 조건에 따라 반복 가능한 다른 반복 가능 요소로 슬라이스 할 수 있습니다.
str.split
의 내장 이터레이터 기반 아날로그가 없습니다.
iterator = iter("abcdcba".split("b"))
iterator
# <list_iterator at 0x49159b0>
next(iterator)
# 'a'
그러나이 타사 라이브러리에서 도구 가능성이 more_itertools.split_at
, 당신이 원하는 것을 제공 : 당신의 필요에 따라 당신은리스트 반복자를 만들 수 있습니다. 예를 들어 this post을 참조하십시오.
- 1. 문자열을 행으로 나누기
- 2. C에서 문자열을 별도의 부분으로 나누기
- 3. 문자열을 여러 문자열 그룹으로 나누기
- 4. C++ 문자열을 두 부분으로 나누기
- 5. multi_index composite_key 반복자로 대체하십시오.
- 6. C++ 반복자로 잘못된 메모리 위치 참조하기
- 7. 줄이없는 문자열을 최대 열 개수의 줄 목록으로 나누기
- 8. 주변을 제거하기 위해 문자열을 나누기 < and > 문자
- 9. 단락 나누기
- 10. 수량 나누기
- 11. 문자열 나누기
- 12. 무한대로 나누기
- 13. 단락을 ZSH의 줄로 나누기
- 14. 정규식 문제를 통해 문자열 나누기
- 15. 여러 열에서 문자열의 요소 나누기
- 16. 세계를 4 사분면으로 나누기
- 17. 내 코드에서 0으로 나누기
- 18. div 요소 나누기
- 19. 그룹화의 조건부 페이지 나누기
- 20. ASP.NET에서 html 테이블 나누기
- 21. 부분으로 정수 나누기
- 22. numpy 축을 따라 나누기
- 23. PHP 배열 나누기
- 24. SSRS - 페이지 나누기 문제
- 25. 입체와 복식 나누기
- 26. 문자열 값을 나누기 C#
- 27. 값 목록 나누기
- 28. 단어 배열로 문자열 나누기
- 29. 탭 텍스트로 나누기
- 30. WIX 파일 나누기
"대부분의 문자열을 소비 할 필요가 없습니다"? 이것은 무엇을 의미 하는가? 문자열 객체는 모두 메모리에 있습니다. 모든 것이 메모리에 있고 이미 시퀀스이므로 문자를 반복 할 필요가 없습니다. "대부분의 문자열을 소비 할 필요가 없다"는 의미를 정의 해 주시겠습니까? –
예, 문자열이 이미 메모리에 있습니다. 그러나 분할 할 위치를 결정하거나 분할로 인해 부분 문자열을 만들 때 문자열 전체를 탐색 할 필요가 없습니다. –
아마 당신은 iterator를 제공하는 어떤 종류의 tokeniser 또는 스캐너가 필요합니다. 아래의 정규 표현식 솔루션의 대답이 효과가 있습니다. –