Python. Разбить строку на слова с учётом кавычек

Предположим, вы собираете архив статей, и хотите для каждой автоматически определять теги — по ним можно будет моментально найти статью в архиве. В качестве тегов решили брать топ-3 слова из текста.

Например, такая статья:

text = """Голубь Френк прибыл в отель "Четыре сезона" с дружеским визитом. По сообщениям очевидцев, он сожрал в ресторане киноа прямо из тарелки гостя, а затем клюнул в глаз прибежавшего на шум официанта.

Френк прилетает в "Четыре сезона" каждый год. В прошлый раз мерзкая птица нагадила в ванну с шампанским в королевском люксе, лишив кого-то романтического вечера."""

Вы чистите текст от пунктуации, бьёте по пробелам и считаете слова. Вот топ-3:

[('френк', 2),
 ('четыре', 2),
 ('сезона', 2)]

Но погодите, разве правильно считать «четыре» и «сезона» разными тегами? Это ведь название отеля, лучше учитывать их как одно словосочетание. Тут-то и пригодится функция shlex.split() — она трактует словосочетания в кавычках как один токен:

# слегка чистим text, для краткости опускаю
import shlex
from collections import Counter

words = shlex.split(text)
words = [word for word in words if len(word) > 3]
Counter(words).most_common(3)

[('френк', 2),
 ('четыре сезона', 2),
 ('голубь', 1)]

Вот теперь теги что надо!

P.S. Вообще, shlex предназначен для разбора shell-подобных строк, так что если злая судьба заставит вас парсить bash-скрипты — вы знаете, куда смотреть.

Заметка из телеграм-канала «Oh My Py»