Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Grzegorz WierzowieckiОтветов: 2

В 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]

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы