Разбиение строки на итератор - PullRequest
22 голосов
/ 03 января 2011

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

Ответы [ 6 ]

15 голосов
/ 03 января 2011

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

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

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 голосов
/ 03 января 2011

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

1 голос
/ 22 января 2018

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

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

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

0 голосов
/ 07 июня 2016

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

0 голосов
/ 03 января 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...