В Python3 многие методы возвращают объекты итераторов или генераторов (вместо списков или других тяжелых объектов в python2).
Однако я обнаружил, что строка разделения по-прежнему возвращает list вместо generator или iteator :
~$ python3
Python 3.2.2
(...)
>>> type('a b c d'.split())
<class 'list'>
Есть ли встроенная функция для разделения строки с помощью generator или iterator?
(Я знаю, что мы можем разделить его самостоятельно и написать хорошую функцию генератора. Мне любопытно, есть ли что-то в стандартной библиотеке или языке для этого)
Ответ 1 · рейтинг 4 · Andbdrew
Ознакомьтесь с re.finditer в модуле re => Python Docs
Вкратце:
""" Возвращает итератор, возвращающий объекты совпадения по всем неперекрывающимся совпадениям для шаблона RE в строке. Строка сканируется слева направо, и совпадения возвращаются в порядке их обнаружения. Пустые совпадения включаются в результат, если они коснитесь начала другого совпадения. """
Я думаю, он сделает то, что вам нужно. Например:
import re
text = "This is some nice text"
iter_matches = re.finditer(r'\w+', text)
for match in iter_matches:
print(match.group(0))
Ответ 2 · Subham
Ответ на основе регулярных выражений небольшой, но для тех, кто все еще новичок и хотел написать его, вот один из способов сделать это:
import string
def gsplit(s,sep=string.whitespace):
word = []
for c in s:
if c in sep:
if word:
yield "".join(word)
word = []
else:
word.append(c)
if word:
yield "".join(word)
text = "This is some nice text"
print(type(gsplit(text)))
for i in (gsplit(text)):
print(i)
<class 'generator'>
This
is
some
nice
text
[Program finished]