Удаление небольших слов с помощью Python

Можно ли использовать regex для удаления небольших слов в тексте? Например, у меня есть следующая строка (текст):

anytext = " in the echo chamber from Ontario duo "

Я хотел бы удалить все слова, которые имеют 3 символа или меньше. Результат должен быть:

"echo chamber from Ontario"

Возможно ли это, используя регулярное выражение или любую другую функцию python?

Спасибо.

Ответы

Ответ 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

Ответ 2

Я не думаю, что вам нужен регулярное выражение для этого простого примера...

' '.join(word for word in anytext.split() if len(word)>3)