Подтвердить что ты не робот

Разбиение строки на итератор

Есть ли в python встроенный (что означает в стандартных библиотеках), чтобы сделать разделение на строки, которое создает итератор, а не список? Я имею в виду работу над очень длинными строками и не нуждаюсь в том, чтобы потреблять большую часть строки.

4b9b3361

Ответ 1

Непосредственно разделение строк как таковых, но модуль 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

Как и s.Lott, я не совсем понимаю, чего вы хотите. Вот код, который может помочь:

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.

Ответ 3

Если вам не нужно потреблять всю строку, это потому, что вы ищете что-то конкретное, не так ли? Тогда просто найдите это, вместо re или .find() вместо разделения. Таким образом, вы можете найти часть интересующей вас строки и разделить ее.

Ответ 4

Вы можете использовать что-то вроде SPARK (который был поглощен самим дистрибутивом Python, хотя и не был импортирован из стандартной библиотеки), но в конечном итоге он использует регулярные выражения, поэтому ответ Duncan, возможно, послужит вам так же хорошо, если это будет так просто, как просто "расщепление на пробелы".

Другим, гораздо более трудным вариантом было бы написать свой собственный модуль Python в C, чтобы сделать это, если вы действительно хотели скорость, но, конечно, гораздо большие инвестиции времени.

Ответ 5

Посмотрите itertools. Он содержит такие вещи, как takewhile, islice и groupby, который позволяет вырезать итерируемый - строка итерабельна - в другую итерабельную на основе индексов или булевских условий сортировки.

Ответ 6

Нет встроенного итераторного аналога str.split. В зависимости от ваших потребностей вы можете создать итератор списка:

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

Однако инструмент из этой сторонней библиотеки, вероятно, предлагает то, что вы хотите, more_itertools.split_at. См. Также этот пост для примера.