Работа с текстом / подсказка к 1 задачке

1

Подсчитать количество слов в тексте с нечетным количество букв

Чтобы из текста извлечь слова, надо просто разбить текст пробелами. Делается это так:

text = "В лесу родилась елочка"
words = text.split(" ") # внутри функции указываем разделитель, то есть пробел
print(words)

в результате получим список

['В', 'лесу', 'родилась', 'елочка']

правда все становится сложнее, когда в тексте появляются всякие знаки препинания и даже переносы:

text = """
Кот покачивался в люстре, размахи которой все уменьшались, 
дуя зачем-то в дуло браунинга и плюя себе на лапу.
"""
words = text.split(" ")
print(words)

в этом случае список становится сильно странным:

[
'\nКот', 'покачивался', 'в', 'люстре,', 
'размахи', 'которой', 'все', 'уменьшались,',
'\nдуя', 'зачем-то', 'в', 'дуло', 'браунинга',
'и', 'плюя', 'себе', 'на', 'лапу.\n'
]

то есть тут слова склеиваются с запятыми и точками, и еще какой-то \n появился (это на самом деле символ переноса строки).

Поэтому более грамотным способом разбиения текста на слова заключается в использовании так называемых регулярных выражений. Это особые текстовые конструкции, которые позволяют указать в качестве разделителя целое семейство символов.

Работает это так:

import re # подключаем библиотечку для работы с регулярными выражениями

text = """
Кот покачивался в люстре, размахи которой все уменьшались, 
дуя зачем-то в дуло браунинга и плюя себе на лапу.
"""
words = re.split("\s", text) # тут заменяем на такую конструкцию
print(words)

у функции re.split два параметра первый это какое семейство символов использовать в качестве разделителя, мы указали \s – в него входят пробелы и переносы строки. Ну а второй символ это собственно текст, который разбивают.

Выдаст это вот такое:

[
'', 'Кот', 'покачивался', 'в', 'люстре,', 
'размахи', 'которой', 'все', 'уменьшались,', 
'', 'дуя', 'зачем-то', 'в', 'дуло', 'браунинга',
'и', 'плюя', 'себе', 'на', 'лапу.', ''
]

уже симпатичнее, так как символы переноса строки \n ушли, но правда появились пустые строки ''. Но бог с ними, их легко отфильтровать по длине. Осталось придумать как избавится от запятых.

В регулярных выражениях есть специальный класс именуемый \w – который соответствует все буквам и цифрам, и противоположный ему, написанный с большой буквы \W который соответствует все символами которые не являются буквами и цифрами. Соответственно, чтобы разбить текст на слова, надо просто вместо \s подставить \W, пробуем

import re

text = """
Кот покачивался в люстре, размахи которой все уменьшались, 
дуя зачем-то в дуло браунинга и плюя себе на лапу.
"""
words = re.split("\W", text) # заменили на \W
print(words)

проверяем

[
'', 'Кот', 'покачивался', 'в', 'люстре',
'', 'размахи', 'которой', 'все', 'уменьшались',
'', '', 'дуя', 'зачем', 'то', 'в', 'дуло', 'браунинга',
'и', 'плюя', 'себе', 'на', 'лапу', '', ''
]

красота! =)

Теперь либо только слова, либо только пустые строки. Собственно, и все. Теперь чтобы решить задачу

Подсчитать количество слов в тексте с нечетным количество букв

надо

  1. Завести переменную под счетчик
  2. В цикле проходить по всем словам в words
  3. Проверять длину слова через len
  4. И если длина слово при делении на 2 дает остаток 1 то увеличивать счетчик на 1