Ответ 1
Конечно, это не так сложно:
shortword = re.compile(r'\W*\b\w{1,3}\b')
Вышеприведенное выражение выбирает любое слово, которому предшествуют некоторые символы, отличные от слов (по сути, пробел или начало), составляет от 1 до 3 символов, заканчивается на границе слова.
>>> shortword.sub('', anytext)
' echo chamber from Ontario '
Здесь важны граничные совпадения \b
, они гарантируют, что вы не будете соответствовать только первому или последнему 3 символам слова.
\W*
в начале позволяет удалить как слово, так и предыдущие символы без слов, чтобы остальная часть предложения все еще соответствовала. Обратите внимание, что пунктуация включена в \W
, используйте \s
, если вы хотите удалить предыдущие пробелы.
Для чего это стоит, это решение регулярного выражения сохраняет лишние пробелы между остальными словами, в то время как версия mgilson сворачивает несколько пробельных символов в одно пространство. Не уверен, что это важно для вас.
Его решение по составлению списка является более быстрым из двух:
>>> import timeit
>>> def re_remove(text): return shortword.sub('', text)
...
>>> def lc_remove(text): return ' '.join(word for word in text.split() if len(word)>3)
...
>>> timeit.timeit('remove(" in the echo chamber from Ontario duo ")', 'from __main__ import re_remove as remove')
7.0774190425872803
>>> timeit.timeit('remove(" in the echo chamber from Ontario duo ")', 'from __main__ import lc_remove as remove')
6.4250049591064453