Python3 split() с генератором

В Python3 многие методы возвращают объекты итераторов или генераторов (вместо списков или других тяжелых объектов в python2).

Однако я обнаружил, что строка разделения по-прежнему возвращает list вместо generator или iteator :

~$ python3
Python 3.2.2
(...)
>>> type('a b c d'.split())
<class 'list'>

Есть ли встроенная функция для разделения строки с помощью generator или iterator?

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


person Grzegorz Wierzowiecki    schedule 23.05.2012    source источник


Ответы (2)


Ознакомьтесь с 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))
person Andbdrew    schedule 23.05.2012
comment
Хорошо, что вы указали из документации, что это то, что мне нужно. - person Grzegorz Wierzowiecki; 25.05.2012
comment
@JBernardo Я видел это - прежде чем комментировать, сначала проверьте комментарии под своим постом. Спасибо :) - person Grzegorz Wierzowiecki; 25.05.2012

Ответ на основе регулярных выражений небольшой, но для тех, кто все еще новичок и хотел написать его, вот один из способов сделать это:

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]
person Subham    schedule 16.03.2021